完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
在使用STM8的PWM功能时,一般都是改变占空比来改变输出电压大小。但是有时候不需要改变PWM的占空比,而是需要按照一定的规律改变输出PWM的频率,而占空比保持不变。现在总结一下如何实现STM8单片机输出PWM波时动态改变频率。
直接看C代码的实现 #include "pwm.h" u16 FRE = 100; //frequency 频率 4M / 100 = 40K void PWM_GPIO_Init( void ) { PC_DDR |= ( 1 << 7 ); //PC7 推挽输出 PC_CR1 |= ( 1 << 7 ); } void TIM1_Init( void ) { PWM_GPIO_Init(); TIM1_CR1 = (1<<7); //自动预装载允许 TIM1_CCMR2 = (6<<4)|(1<<3)|(1<<2); //TIM1 CH2 PWM1 输出比较1预装载使能 输出比较1 快速使能 TIM1_CCER1 |= 0x10; //CC2为输出 高电平有效 TIM1_PSCRH = 0x00; //预分频 0 TIM1_PSCRL = 0x03; //16M/(1+3)=4 M TIM1_ARRH = FRE >> 8; //设定自动重装载值高8位 TIM1_ARRL = FRE; //设置自动重装载值低8位 TIM1_BKR = 0x80; //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平 TIM1_EGR = (1<<0); //产生更新事件 TIM1_CR1 |= 0x01; //使能计数器 } //TIM1 CH2 PC7 void TIM1_CH2_FRE_DC_Change( unsigned int freq, unsigned int dc ) { TIM1_ARRH = freq >> 8; //设置频率 TIM1_ARRL = freq; TIM1_CCR2H = dc >> 8; TIM1_CCR2L = dc; } 首先初始化PWM口,这里使用的是定时器1通道2,也就是PC7口,下来初始化定时器,将定时器1通道2设置为PWM功能,这里记住一定要开启自动预装载功能,不开起预装载功能,直接改变ARR寄存器的值时,输出的频率也能发生改变,但是输出的PWM波形有时候会出现丢失现象,也就是会有一段时间无波形输出,开启自动预装载功能后,放入ARR寄存器的值不会立即发生改变,而是在更新ARR的值时才发生改变,这样在变频时就能保证输出的每个周期波形都是完整的,不会出现输出PWM波形丢失现象。 初始化完定定时器后,将频率和占空比的设置单独封装一个函数,这样需要变频的时候,直接调用这个函数就行。 定时器的时钟设置为4MHz,ARR寄存器的值设置为100时,输出频率为4M/100=40KHz,当ARR寄存器的值设置为1000时,输出频率为4MHz/1000=4KHz,这样当ARR的值在100到1000之间连续变化时,输出的PWM频率就会在40K到4K之间连续变化。 主程序代码如下 #include "iostm8s103F3.h" #include "led.h" #include "pwm.h" void SysClkInit( void ) { CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率 CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频 } void main( void ) { unsigned int i = 0; SysClkInit(); __asm( "sim" ); TIM1_Init(); __asm( "rim" ); while( 1 ) { for( i = 100; i < 1000; i++ ) { TIM1_CH2_FRE_DC_Change( i, i / 2 ); } } } 主程序的主要功能就是循环调用TIM1_CH2_FRE_DC_Change()函数来改变频率和占空比,在本例程中将占空比的值设置为频率的一半,这样在任何频率下占空比都是50%。ARR寄存器值设置为100到1000循环变化,这样输出的PWM频率就会在40K到4K之间循环变化。 输出PWM波形如下: 可以看到输出一个脉冲之后频率改变了一次,而占空比没有发生变化。 |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
598浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:34 , Processed in 1.200614 second(s), Total 78, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号