完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在上一篇博文通用定时器的中断中,描述了通用定时器中断的流程,这一节除了需要时钟源和时基单元外,还需要输出通道,这里涉及一个非常重要的寄存器,输出比较寄存器,如图
通过设置该寄存器(CCRX)来调整pwm输出的占空比,如下图所示: CNT计数器计的值超过CCRx的值时候,输出高电平,低于时输出低电平。在上一篇博文中设置溢出时间Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk,可见设置ARR和PSC可以设置pwm的输出频率。 以通道1为例说明pwm的工作过程: 首先通过设置CCR1(捕获比较(值)寄存器)设置设置比较值。 然后通过设置CCMR1: OC1M[2:0]位以及CCER:CC1P位(输入/捕获1输出极性)来设置高低电平的输出模式,具体如图所示 最后设置CCER:CC1E位,使能输入/捕获1输出。 下面结合代码具体实现pwm输出: (1)使能相关时钟,实验涉及到通用定时器3,pb5以及pb5的复用功能,所以要使能三个时钟,代码如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 (2)为了显示实验效果,将tim3的输出通道部分映射至pb5 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2-》PB5 (3)初始化gpio端口 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO (4)初始化tim3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 (5)初始化tim3 channel2 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 (6)使能TIM3在CCR2上的预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); (7) 使能TIM3 TIM_Cmd(TIM3, ENABLE); 主函数 int main(void) { u16 pwmval=0; u8 dir=1; delay_init(); //延时函数初始化 LED_Init(); //LED端口初始化 timer_pwm_init(899,0); //不分频,PWM频率=72000000/900=80Khz while(1) { delay_ms(10); if(dir) pwmval++; else pwmval--; if(pwmval》300) dir=0; if(pwmval==0) dir=1; TIM_SetCompare2(TIM3,pwmval); //间隔10ms调整pwm的占空比 } } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1921 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1687 浏览 1 评论
1174 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
772 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1735 浏览 2 评论
1978浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
810浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
259浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
625浏览 3评论
635浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-26 15:39 , Processed in 0.634546 second(s), Total 41, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号