STM32的PWM波形输出配置的大神总结

本文分享stm32之pwm波形输出配置总结。
一.   timer分类:
stm32中一共有11个定时器,其中tim6、tim7是基本定时器;tim2、tim3、tim4、tim5是通用定时器;tim1和tim8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的systick。
其中tim1和tim8是能够产生3对pwm互补输出,常用于三相电机的驱动,时钟由apb2的输出产生。tim2-tim5是普通定时器,tim6和tim7是基本定时器,其时钟由apb1输出产生。
二、pwm波形产生的原理:
通用定时器可以利用gpio引脚进行脉冲输出,在配置为比较输出、pwm输出功能时,捕获/比较寄存器timx_ccr被用作比较功能,下面把它简称为比较寄存器。
这里直接举例说明定时器的pwm输出工作过程:若配置脉冲计数器timx_cnt为向上计数,而重载寄存器timx_arr被配置为n,即timx_cnt的当前计数值数值x在timxclk时钟源的驱动下不断累加,当timx_cnt的数值x大于n时,会重置timx_cnt数值为0重新计数。
而在timxcnt计数的同时,timxcnt的计数值x会与比较寄存器timx_ccr预先存储了的数值a进行比较,当脉冲计数器timx_cnt的数值x小于比较寄存器timx_ccr的值a时,输出高电平(或低电平),相反地,当脉冲计数器的数值x大于或等于比较寄存器的值a时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器timx_arr存储的数值(n+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器timx_ccr的值a乘以触发脉冲的时钟周期,即输出pwm的占空比为 a/(n+1) 。
三、stm32产生pwm的配置方法:
1、配置gpio口:
配置io口的时候无非就是开启时钟,然后选择引脚、模式、速率,最后就是用结构体初始化。不过在32上,不是每一个io引脚都可以直接使用于pwm输出,因为在硬件上已经规定了用某些引脚来连接pwm的输出口。下面是定时器的引脚重映像,其实就是引脚的复用功能选择:
a.定时器1的引脚复用功能映像:
b.定时器2的引脚复用功能映像:
c.定时器3的引脚复用功能映像:
d.定时器4的引脚复用功能映像:
根据以上重映像表,我们使用定时器3的通道2作为pwm的输出引脚,所以需要对pb5引脚进行配置,对io口操作代码:
gpio_inittypedef gpio_initstructure;//定义结构体rcc_apb2periphclockcmd(rcc_apb2periph_gpiob  | rcc_apb2periph_afio, enable);//使能gpio外设和afio复用功能模块时钟gpio_pinremapconfig(gpio_partialremap_tim3, enable); //选择timer3部分重映像    //选择定时器3的通道2作为pwm的输出引脚tim3_ch2->pb5    gpiob.5gpio_initstructure.gpio_pin = gpio_pin_5; //tim_ch2gpio_initstructure.gpio_mode = gpio_mode_af_pp;  //复用推挽功能gpio_initstructure.gpio_speed = gpio_speed_50mhz;gpio_init(gpiob,  gpio_initstructure);//初始化引脚  
2、初始化定时器:
tim_timebaseinittypedef  tim_timebasestructure;//定义初始化结构体rcc_apb1periphclockcmd(rcc_apb1periph_tim3, enable); //使能定时器3时钟//初始化tim3tim_timebasestructure.tim_period = arr; //自动重装载寄存器的值tim_timebasestructure.tim_prescaler =psc; //timx预分频的值tim_timebasestructure.tim_clockdivision = 0; //时钟分割tim_timebasestructure.tim_countermode = tim_countermode_up;  //向上计数tim_timebaseinit(tim3,  tim_timebasestructure); //根据以上功能对定时器进行初始化  
3、设置tim3_ch2的pwm模式,使能tim3的ch2输出:
tim_ocinittypedef  tim_ocinitstructure;//定义结构体tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm2;//选择定时器模式,tim脉冲宽度调制模式2tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;//比较输出使能tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_low;//输出比较极性低tim_oc2init(tim3,  tim_ocinitstructure);//根据结构体信息进行初始化tim_oc2preloadconfig(tim3, tim_ocpreload_enable);  //使能定时器tim2在ccr2上的预装载值  
4、使能定时器3:
tim_cmd(tim3, enable);  //使能定时器tim3  
经过以上的操作,定时器3的第二通道已经可以正常工作并输出pwm波了,只是其占空比和频率都是固定的,我们可以通过改变tim3_ccr2,则可以控制它的占空比。修改占空比的函数为:tim_setcompare2(tim3,n);  n不同,占空比不同。
5、修改pwm波形的占空比:
编写一个函数:void tim3_pwm_init(u16 arr,u16 psc);将以上所有的代码都加进来这个函数中,只要在main函数中调用该函数进行初始化,然后使用tim_setcompare2()函数修改pwm的占空比就可以在pb5脚得到需要的pwm波形了。关于频率以及占空比的计算方法有以下例子:
int main(void){    tim3_pwm_init(9999,143);//频率为:72*10^6/(9999+1)/(143+1)=50hz    tim_setcompare2(tim3,4999);//得到占空比为50%的pwm波形    while(1);}  
来源:硬件攻城狮
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


CMOS图像传感器市场前景大好,该如何抓住机遇
foc跟矢量控制有什么区别_解析foc驱动技术
2020年深圳市质量强市促进大会暨质量强市建设年度盛典举办
意法半导体70W大功率无线充电芯片组提升充电速度、能效和灵活性
手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集
STM32的PWM波形输出配置的大神总结
iPhone 5技术参数全解读:三星无地自容!?
匿名化在大数据时代真的可以保护我们隐私吗
教你了解DSP与单片机的区别
!!销售! 计数秤 MACS 衡之宝 高精度电脑计数秤 赵R
华为荣耀V9:继华为P10闪存门之后荣耀V9等再陷“闪存门”,请不要再讲爱国情怀
瑞识科技斩获“2022感知领航”年度杰出产品优秀提名项目
手机产业“卷”如何破?机器视觉降本增效助突围
模糊传感器的结构特性及应用
关于锂电池焊盖帽CCD在线检测的简述
在互联网时代,AI技术对企业来说意味着什么?
CL9945系列3端CMOS降压型电压稳压器介绍
曝小米正开发一款智能手表 预计在十月份发布并全部标配NFC
全新小米笔记本大揭秘,还不如这台国产“苹果本”!
iPhone 5内存信息曝光:容量1GB频率1066MHz