stm32中定时器产生不同PWM的基本思路.doc_第1页
stm32中定时器产生不同PWM的基本思路.doc_第2页
stm32中定时器产生不同PWM的基本思路.doc_第3页
stm32中定时器产生不同PWM的基本思路.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在stm32中利用定时器tim调制pwm的几种方法:说说我的学习经历:从开始接触到现在有好几个月了,但是学习还是比较的费劲,而且速度也比较的缓慢,当然相比之前还是有很大的进步,记得刚刚学习的时候,建工程都是大四学长手把手教的。废话不多说先来讲讲定时器的配置:stm32f10系列最少3个、做多有8个定时器,都是16位定时器,且相互之间是独立的,计数范围为0x0000-0xffff,最大计数值为65535.可以用于测量输入信号的脉冲长度或者产生输出波形(输出比较和pwm)分为通用定时器,高级定时器,以及看门狗定时器下面主要讲通用定时器的配置问题:以定时器tim1为例:先进行函数的配置void timer1_config() tim_timebaseinittypdef tim_timebasestructure; /开定时器1外设时钟 rcc_apb1periphclockcmd(rcc_apb1periph_tim1,enable); /计时50000次时间为50000/10m=500ms tim_timebasestructure.tim_period=50000 ; tim_timebasestructure.tim_prescaler = 720-1;/720分频 tim_timebasestructure.tim_clockdivision =0;/时钟分割为0; /计数模式向上计数 tim_timebasestructure.tim_countermode=tim_countermode_up; tim_timebaseinit(tim1,&tim_timebasestructure)/初始化tim1 tim_itconfig(tim1,tim_it_update,enable);/开启定时器中断 tim_cmd(tim1,enable); /使能定时器关于时间的计算问题:外设系统时钟的频率为72m,进行720分频以后,频率f=72m/720=100khz. 如果要定时0.1s则计数值为10000,计算公式为:时间(t)=计数值(n)/频率(f).注意计数值n介于0到65535之间有定时器则一定会有中断发生,所以要配置中断优先级,对于中断优先级函数配置如下:void nvic_config() nvic_inittypdef nvic_initstructure; /抢占优先级为1位,从优先级为3位 nvic_prioritygroupconfig(nvic_prioritygroup_1) ; nvic_initstructure.nvic_irqchannel=tim1_irqn; /定义定时器1为请求通道 nvic_initstructure.nvic_irqchannelpreemptionpriority=0; /抢占式优先级为0 nvic_initstructure.nvic_irqchannelsubpriority=2; /从优先级为2 nvic_initstructure.nvic_irqchannelcmd=enable; /使能中断优先级 nvic_init(&nvic_initstructure);/初始化中断 对于优先级中的抢占式和从优先级做如下解释:抢占式优先级:是可以抢占的中断,比如正在执行的优先级为10的中断,突然来了一个优先级为5的中断,此时cpu会转向优先级为5的中断;从优先级:从优先级不会抢占正在执行的中断程序,但是如果两个事件同时发生,那么cpu会执行优先级高的事件,但是已经执行就不会再更改了,即使优先级比正在执行的高,这正好和抢占式优先级不同,抢占式优先级不论程序是否在执行,只要现在发生的中断优先级比正在执行的要高,就会更改。接下来写中断处理函数:void tim1_irqhandler(void)if(tim_getitstatus(tim1,tim_it_update)!=reset) /接受到中断tim_clearnitpendingbit(tim1,tim_it_update); /清除中断位功能模块1,需要实现的功能功能模块2.功能模块中写上自己需要实现的功能至此,一个完整的定时器函数模块定义完成,下面我给大家写一下如何调制pwm,定时器中对于pwm的调制有几种状态,第一种频率占空比一定,第二种频率和占空比可以改变,第三种频率一定,占空比可以改变。先讲第一种情况:频率和占空比一定时的配置情况void tim1_configuration(void)tim_timebaseinittypedef tim_timebasestructure;tim_ocinittypedef tim_ocinitstructure;gpio_inittypedef gpio_initstructure;/* pa8设置为功能脚(pwm) */gpio_initstructure.gpio_pin = gpio_pin_8|gpio_pin_9;gpio_initstructure.gpio_mode = gpio_mode_af_pp; /复用推挽输出(该脚已经用过)gpio_initstructure.gpio_speed = gpio_speed_50mhz; gpio_init(gpioa, &gpio_initstructure);rcc_apb2periphclockcmd(rcc_apb2periph_tim1,enable);/开tmi1外设时钟tim_deinit(tim1);/将tmi寄存器设置为缺省状态/*tim1时钟配置*/tim_timebasestructure.tim_prescaler = 4000;/预分频(时钟分频)72m/4000=18ktim_timebasestructure.tim_countermode = tim_countermode_up;/向上计数tim_timebasestructure.tim_period = 144;/装载值 18k/144=125hz 时间为8mstim_timebasestructure.tim_clockdivision = tim_ckd_div1;tim_timebasestructure.tim_repetitioncounter = 0x0;/repetition 重复计数器/tim_timebasestructure.tim_repetitioncounter = 0x0;/repetition 重复计数器。tim_repetitioncounter:设置周期计数器,其值必须在0x00-0xff之间,且此参数只适用于tmi1和tmi8种tim_timebaseinit(tim1,&tim_timebasestructure);/设置两个不同占空比的定时器通道oc1、oc2;/* channel 1 configuration in pwm mode 设置tim1通道1的参数*/tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm2; /pwm模式2tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; /正向通道有效tim_ocinitstructure.tim_outputnstate = tim_outputnstate_disable;/反向通道无效tim_ocinitstructure.tim_pulse = 40; /占空时间 总的周期为8ms 占空时间为约为2.4mstim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_low; /输出极性tim_ocinitstructure.tim_ocnpolarity = tim_ocnpolarity_high; /互补端的极性 tim_ocinitstructure.tim_ocidlestate = tim_ocidlestate_set; /输出空闲非工作状态tim_ocinitstructure.tim_ocnidlestate = tim_ocidlestate_reset; /输出互补空闲非工作状态/* channel 2 configuration in pwm mode 设置tim1通道2的参数*/tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm2; /pwm模式2tim_ocinitstructure.tim_outputstate = tim_outputstate_enable; /正向通道有效tim_ocinitstructure.tim_outputnstate = tim_outputnstate_disable;/反向通道无效tim_ocinitstructure.tim_pulse = 72; /占空时间 总的周期为8ms 占空时间为约为4mstim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_low; /输出极性tim_ocinitstructure.tim_ocnpolarity = tim_ocnpolarity_high; /互补端的极性 tim_ocinitstructure.tim_ocidlestate = tim_ocidlestate_set; /输出空闲非工作状态tim_ocinitstructure.tim_ocnidlestate = tim_ocidlestate_reset; /输出互补空闲非工作状态tim_oc2init(tim1,&tim_ocinitstructure); /初始化通道2/* tim1 counter enable */tim_cmd(tim1,enable);/使能定时器1/* tim1 main output enable */tim_ctrlpwmoutputs(tim1,enable);/使能定时器1的主输出/一般定时器一种有个四个通道 oc1、oc2、oc3、oc4;/注意占空比tim_ocinitstructure.tim_pulse 的值不能超过定时器的周期,也即tim_timebasestructure.tim_period 的值,第二种情况:频率一定占空比可以任意设置,频率一定的情况下可以改变定时器输出通道tim_ocinitstructure.tim_pulse的值,这种情况下可以通过给定时器的捕获寄存器的值进行改变,即改变脉冲的大小,从而改变占空比在上述的程序的基础上增加如下程序:/设置捕获寄存器1voi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论