【stm32】的PWM外设|学习笔记
2024-10-21 18:33:31
PWM简单理解就是生成PWM方波,主要可控的参数有周期,占空比,极性。
stm32内置PWM生成器,我想应该是用TIM加比较器来实现的吧,那么如何实现stm32输出PWM波呢?
一、得知道那些IO可以输出PWM,貌似带TIM的都能直接输出,这个可以在数据手册中查到。
我收头的板子要产生两路+12V/-12V的PWM,我打算用TIM5的CH1和CH4两个通道生成PWM,所以一路接PA0一路接PA3。
二、软件上要配置IO、TIM及比较器。
1.配置IO,mode = AF ,注意一定要开启AF功能GPIO_PinAFConfig();
GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource0, GPIO_AF_TIM5);
GPIO_PinAFConfig(PWM_1_PERIPH, GPIO_PinSource3, GPIO_AF_TIM5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
2.配置TIM5参数,这里主要配置PWM的周期,这里其实配置的是TIM5的周期,也就意味着我的两路PWM是同频率的。这里主要使用到的是分频器Prescaler和倍频器Period两个寄存器,TIM5挂载在APB1上,即PCLK1的频率通过分频与倍频得到想要的PWM周期。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 30000; //周期T=1/30M*30000=1ms
TIM_TimeBaseStructure.TIM_Prescaler = 0; //1+0=1分频 所以频率=30M/1=30M
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
3.配置极性,占空比之类的参数。注意一定要初始化响应的通道,通道1就是TIM_OC1Init();通道4就是TIM_OC4Init();
TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
TIM_OCInitStructure.TIM_Pulse = 3*percent;//占空比=3*percent/30000=percent/10000=(10000-Charger_Config_Infor.u16_CP_PWM)/10000
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出极性:TIM输出比较极性低
TIM_OC1Init(TIM5, &TIM_OCInitStructure);//初始化外设TIMx_CHx
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);//使能TIMx在CCR2上的预装载寄存器
TIM_ARRPreloadConfig(TIM5, ENABLE);//使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM5, ENABLE);//使能TIMx外设
最新文章
- Linux驱动开发—— IS_ENABLED
- CloudNotes:一个云端个人笔记系统
- iOS开发,URL编码和解码
- js二级导航下拉菜单
- flex swf和movieclip之前的微妙关系
- zipimport.ZipImportError: can't decompress data; zlib not available 解决办法
- hdu 2034人见人爱A-B
- 免安装jdk 和 免安装tomcat
- PHP常用文件函数和目录函数整理
- BZOJ 3872 Ant colony
- 如何实现一个通用的IHttpHandler 万能的IHttpHandler HttpWebRequest文件上传
- chrome误删书签恢复。
- IOS开发-UI学习-UINavigationController(导航控制器)的使用
- Spring中获取对象
- Java锁概念基础
- Oracle 10046
- 51nod 1185 || 51nod 1072 威佐夫博弈
- PBR Step by Step(四)Lambertian反射模型
- oracle 导入报错:field in data file exceeds maximum length
- 命令行编译工具NMAKE
热门文章
- golang 中mgo update报错: The dollar ($) prefixed field '$inc' in '$inc' is not valid for storage.
- Java异常之Error和Exception
- CryptoKit 实现 椭圆曲线ECC加密
- iOS 制作一个动态库
- linux查看java堆栈信息_linux进程堆栈大小
- 跨平台Docker篇
- 微服务笔记之Eureka03(服务续约分析)
- mybatis中xml新增一条数据获取自增id
- Jquery 简单实现demo
- Django初识(一)