完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在笔者的上一个博客《STM32F103C8T6编写简单的程序并烧录到板卡上》中,简单介绍了如何产生一个PWM波,但读者可能对设置PWM过程中修改的参数不是很理解。本篇博客将重点讲述如何设置PWM波的频率和初始占空比,以及如何实现占空比可调的PWM。本文中笔者使用的STM32型号仍然是F103C8T6,如果你的STM32型号与之不同也没关系,具体的操作方法是一样的,只是使用的具体引脚需要改变。
1.设置频率和占空比 首先按照《STM32F103C8T6编写简单的程序并烧录到板卡上》将PA8引脚设置为PWM输出引脚。 在Pinout & Configuration -> Timers -> TIMX 的Parameter Settings一栏中: Prescaler代表分频数,首先参照《STM32F103C8T6编写简单的程序并烧录到板卡上》将时钟频率设置为8MHz,然后将Prescaler的值设置为128,代表PWM所用时钟频率为8MHz的128分频,即8M÷128=62500Hz。 Counter Mode代表计数模式,设置为up表示向上计数。 Counter Period代表一个PWM脉冲所占的时钟周期,将Counter Period的值设置为12500,代表一个PWM脉冲的频率为62500÷12500=5Hz。 在Parameter Settings一栏中向下翻页找到Pulse,它代表PWM中高电平所占的时钟周期,将Pulse的值设置为6250,代表PWM的占空比为6250÷12500=50%。 参照上述过程修改参数之后,PA8口就配置好了频率为5Hz,占空比为50%的PWM波。 2.实现占空比可调的PWM 首先参照1中过程配置好PWM初始化参数,随后在main.c函数中通过以下代码调节占空比: HAL_TIM_PWM_Start(&htimX, TIM_CHANNEL_Y); TIMX -> CCRY = 6250; 上述代码中,HAL_TIM_PWM_Start()函数用于启动PWM波的产生,其传入参数中的X代表选用的时钟源编号,Y代表选用的通道编号,如我们选择的PA8则是Timer1中的Channel1,即将上述代码改为: HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); TIM1 -> CCR1 = 6250; 其中“TIM1 -> CCR1 = 6250;”一句代表将PWM中高电平所占的时钟周期设置为6250,这一句等同于在PWM初始化过程中设置Pulse参数为6250。在main.c函数中,将TIM1 -> CCR1值进行改变,即可实现占空比可调的PWM。 3.实战演习-按键控制PWM波的占空比 本次实战演习中,会运用按键控制PWM波的占空比,即初始状态下,PA8引脚输出频率为5Hz,占空比为50%的PWM,每当用户按下一次按键,PWM波的占空比会按照0% -> 25% -> 50% -> 75% -> 100% -> 0% -> …的顺序进行一次改变。 首先按照1中过程在PA8引脚处配置5Hz,初始占空比为50%的PWM波形。参照《STM32F103C8T6编写简单的程序并烧录到板卡上》将按键引脚设置为输入状态。 找到如下代码段: /* USER CODE BEGIN WHILE */ while(1) { /* USER CODE END WHILE */ } 将其改为: /* USER CODE BEGIN WHILE */ int state = 0; HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); while (1) { if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 0) { HAL_Delay(100);// 消抖 if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 0) { state = (state + 1) % 5; switch(state) { case 0: TIM1 -> CCR1 = 0; break; case 1: TIM1 -> CCR1 = 3125; break; case 2: TIM1 -> CCR1 = 6250; break; case 3: TIM1 -> CCR1 = 9375; break; default: TIM1 -> CCR1 = 12500; break; } } } /* USER CODE END WHILE */ } 修改完成后,将程序下载到板子上,即可通过点击按键来控制PWM波的占空比了。读者可以通过示波器观察到PWM波占空比的变化。 |
|
|
|
只有小组成员才能发言,加入小组>>
3323 浏览 9 评论
3000 浏览 16 评论
3498 浏览 1 评论
9073 浏览 16 评论
4093 浏览 18 评论
1198浏览 3评论
614浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2343浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1902浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 01:03 , Processed in 1.514582 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号