资料介绍
首先熟悉一下定时器的PWM相关部分。看图最明白:其实PWM就是定时器的一个比较功能而已。CNT里的值不断++,一旦加到与CCRX寄存器值相等,那么就产生相应的动作。这点和AVR单片机很类似。既然这样,我们要产生需要的PWM信号,就需要设定PWM的频率和PWM的占空比。首先说频率的确定。由于通用定时器的时钟来源是PCLK1,而我又喜欢用固件库的默认设置,那么定时器的时钟频率就这样来确定了,如下:AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。这里为什么是这样,在RCC模块学习记录里有详细记载,不多说。因此图中的CK_PSC就是72MHz了。下面的资料也是网上一搜一大把,我就罗列了:STM32的PWM输出有两种模式,模式1(PWM1)和模式2(PWM2),由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下:110:PWM模式1-在向上计数时,一旦TIMx_CNT=TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。111:PWM模式2-在向上计数时,一旦TIMx_CNT=TIMx_CCR1时通道1为有效电平,否则为无效电平。由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。我用的是模式一,因此后面的设定都是按照模式一来设定的。PWM的周期是就是由定时器的自动重装值和CNT计数频率决定的。而CNT的计数时钟是CK_PSC经分频器PSC得到,因此CNT的时钟就是CK_PSC/分频系数。这个分频系数在TIM_TimeBaseStructure.TIM_Prescaler确定。成都网站设计我设置的值是72,因此CNT的计数频率也就是CK_CNT的频率为1MHz。下一步就是确定定时器自动重装值。因为CNT每自加到ARR寄存器的值时就会自动清零,当然前提是设定为为向上计数模式,而就是根据这个溢出事件来改变PWM的周期。所以PWM信号的频率由ARR的值来确定。我设置的值是1000-1,即TIM_TimeBaseStructure.TIM_Period = 1000-1;因此PWM的周期是1MHz/1000=1KHz。接下来就要确定PWM的占空比了。因为CNT在自加到ARR值的过程中会不断和CRRX的值相比较,一旦二者相等就产生匹配事件,但要注意CNT不会理会这件事,它会继续++直到等于ARR。而CRRX的值我设定为400-1,那么占空比就随之确定为40%。好了,下面就是库函数的配置了。TIMER输出PWM实现步骤1.设置RCC时钟;2.设置GPIO;3.设置TIMx定时器的相关寄存器;4.设置TIMx定时器的PWM相关寄存器。首先是main函数和全局变量申明,很简单,不作说明GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TimOCInitStructure;int main(void){rcc_cfg();gpio_cfg();tim2_cfg();pwm_cfg();//while (1){GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);delay();GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);delay();}}下面是IO口的配置:void gpio_cfg(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);}此处要注意的是PWM输出口要配置为复用推挽输出,原因我也不知道,反正照搬就是了。下面是TIM配置函数,注释很清楚了,不作说明:void tim2_cfg(){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_DeInit(TIM2);TIM_InternalClockConfig(TIM2);//预分频系数为72,这样计数器时钟为72MHz/72 = 1MHzTIM_TimeBaseStructure.TIM_Prescaler = 72;//设置时钟分割TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置计数器模式为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置计数溢出大小,每计1000个数就产生一个更新事件TIM_TimeBaseStructure.TIM_Period = 1000-1;//将配置应用到TIM2中TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//禁止ARR预装载缓冲器TIM_ARRPreloadConfig(TIM2, DISABLE);TIM_Cmd(TIM2, ENABLE);//使能TIMx外设}接下来是关键的PWM的配置函数:void pwm_cfg(){//设置缺省值TIM_OCStructInit(&TimOCInitStructure);//PWM模式1输出TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%TimOCInitStructure.TIM_Pulse = 400-1;//TIM输出比较极性高TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//使能输出状态TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//TIM2的CH2输出TIM_OC2Init(TIM2, &TimOCInitStructure);//设置TIM2的PWM输出为使能TIM_CtrlPWMOutputs(TIM2,ENABLE);}stm32固件库的输出比较单元结构体与定时器的时基单元是分开定义的,而PWM模式只是输出比较结构体成员TimOCInitStructure.TIM_OCMode的一个取值,当把此结构体填充完后,还要映射到某个定时器,用TIM_OCXInit函数实现,我用了一个X,说明不止一个这样的函数,事实上,stm32的通用定时器都有四个通道,每个通道对应一个初始化函数,这里真够纠结的!最后还要使能该定时器的PWM输出功能,TIM_CtrlPWMOutputs(TIM2,ENABLE)函数要注意,是outputs而不是output,说明TIM2不止一个通道嘛!够复杂,够繁琐的!下面是输出比较单元的结构体原型:typedef struct{uint16_t TIM_OCMode;uint16_t TIM_OutputState;uint16_t TIM_OutputNState;uint16_t TIM_Pulse;
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- STM32单片机PWM输出学习
- 单片机软件模拟PWM调光程序下载 62次下载
- 基于STM32单片机的小车PWM调速系统 40次下载
- STM32单片机网络远程升级固件的源码下载 70次下载
- STM32单片机与linux系统单片机串行通信资料下载
- 实现STC单片机PWM输出的程序免费下载 81次下载
- 使用STM32F103RB单片机实现PWM呼吸灯实验的资料免费下载 7次下载
- 单片机的PWM控制技术学习课件免费下载 29次下载
- 使用STM32F1单片机实现PWM输出的源代码和工程文件免费下载 32次下载
- 使用51单片机输出PWM波形的程序免费下载
- 使用单片机PWM实现电压输出的程序免费下载
- 51单片机中断的简单学习资料免费下载
- 51单片机的入门学习资料免费下载
- 如何使用51单片机通过定时器模拟输出多路PWM程序免费下载
- 51单片机的PWM程序资料免费下载 74次下载
- 单片机的输出比较是小思考 396次阅读
- 详解STM32单片机和51单片机的区别 3.7w次阅读
- 普通单片机与STM32单片机中堆栈的区别 3032次阅读
- STM32单片机寄存器的功能解析 5185次阅读
- 51单片机实现PWM输出功能的两种方法解析 2.1w次阅读
- MCS-51系列单片机实现PWM输出功能的方法解析 1868次阅读
- 如何学习STC单片机详细STC单片机资料说明 1.1w次阅读
- 如何采用STM32单片机来产生PWM输出 2.1w次阅读
- 浅谈STM32单片机命名规则和体系架构 1.1w次阅读
- 新手学习单片机的首选:51单片机 8536次阅读
- STM32单片机--PWM输出 1.3w次阅读
- 详细图文剖析STM32单片机串口一键下载电路与操作方法 4.6w次阅读
- 详细的STM32单片机学习笔记 1.4w次阅读
- 单片机初学者必看:这些单片机学习心得要牢记 1.4w次阅读
- 主流32位单片机攻略连载:为什么要学STM32? 7.9w次阅读
下载排行
本周
- 1TPS54202H降压转换器评估模块用户指南
- 1.02MB | 7次下载 | 免费
- 2华瑞昇CR215芯片数字万用表原理图
- 0.21 MB | 1次下载 | 3 积分
- 3SMD LED选型目录 灯珠手册
- 5.36 MB | 1次下载 | 免费
- 4Tiva C系列DK-TM4C129X入门指南
- 1.69MB | 1次下载 | 免费
- 5电涌保护器(SPD)的选择、安装以及装配
- 4.57 MB | 1次下载 | 免费
- 6时源芯微EMC前车灯案例
- 458.59 KB | 1次下载 | 免费
- 7bq25890、bq25892双级联充电器EVM(PWR692)用户指南
- 2.02MB | 1次下载 | 免费
- 8TPS54426降压转换器评估模块用户指南
- 847.7KB | 次下载 | 免费
本月
- 1ADI高性能电源管理解决方案
- 2.43 MB | 156次下载 | 免费
- 22024PMIC市场洞察
- 2.23 MB | 63次下载 | 免费
- 3开关电源设计原理手册
- 1.83 MB | 30次下载 | 免费
- 4智能门锁原理图
- 0.39 MB | 28次下载 | 免费
- 5OAH0428最新规格书(中文)
- 2.52 MB | 15次下载 | 7 积分
- 6ST7789V2单芯片控制器/驱动器英文手册
- 3.07 MB | 9次下载 | 1 积分
- 7LTH7充电电路和锂电池升压5V输出电路原理图
- 0.04 MB | 7次下载 | 免费
- 8TPS54202H降压转换器评估模块用户指南
- 1.02MB | 7次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935119次下载 | 10 积分
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420061次下载 | 10 积分
- 3Altium DXP2002下载入口
- 未知 | 233084次下载 | 10 积分
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191367次下载 | 10 积分
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183334次下载 | 10 积分
- 6labview8.5下载
- 未知 | 81581次下载 | 10 积分
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73807次下载 | 10 积分
- 8LabVIEW 8.6下载
- 未知 | 65987次下载 | 10 积分
评论
查看更多