完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在做 PWM 方面的应用,在新唐官网下了 MS51EC0AE 的例程,看了下 PWM 的例程,都是基于系统时钟的,PWM 信号也出来了,但是因为系统时钟即使经过128分频后频率还是较高,PWM 的最低频率达不到1Hz,如果PWM的时钟信号采用T1的溢出频率的话,肯定能把最低输出频率降到1Hz,但是官方例程里没有基于T1的,有用过的老师吗?
|
|
相关推荐
1个回答
|
|
可以参考以下代码,基于T1定时器的PWM实现:
```c #include "MS51_16K.H" #include #define PWM_PERIOD 1000 #define PWM_DUTY 500 volatile uint32_t sys_time_ms = 0; void PWM_Init(void) { TMOD &= ~0xF0; TMOD |= 0x10; //Set Timer 1 to Mode 1 (16-bit timer mode) TH1 = 256 - PWM_PERIOD / 2; TL1 = 256 - PWM_PERIOD / 2; set_PWM1 = PWM_DUTY; set_PWM2 = PWM_DUTY; set_PWM3 = PWM_DUTY; set_PWM4 = PWM_DUTY; set_PWM_mode1; set_PWM_mode2; set_PWM_mode3; set_PWM_mode4; set_CLKOUT; //Enable CLKO output set_CKCON_T1M; //Select Timer 1 clock source as system clock / 12 set_TCON_TR1; //Start Timer 1 } void ISR_SysTick(void) interrupt 1 { sys_time_ms++; } int main() { P06_PUSHPULL_MODE; P07_PUSHPULL_MODE; P05_PUSHPULL_MODE; P04_PUSHPULL_MODE; PWM_Init(); while(1) { if(sys_time_ms % 1000 == 0) { printf("SysTime: %ldmsn", sys_time_ms); } } } ``` 以上代码中,PWM输出信号来自于PWM1-PWM4引脚。在PWM_Init函数中,设置了时钟源为系统时钟除以12,并且启动了定时器T1。定时器T1的自动重装载值为PWM_PERIOD / 2。在中断服务程序ISR_SysTick中,更新系统时间sys_time_ms,以便于可以在主程序中测量时间并进行调试。注意,为了避免输出频率过高,PWM_PERIOD和PWM_DUTY必须适当调整,使得输出频率不超过所需要的最大频率。 |
|
|
|
只有小组成员才能发言,加入小组>>
813 浏览 0 评论
1162 浏览 1 评论
2535 浏览 5 评论
2871 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2719 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1111浏览 3评论
198浏览 2评论
465浏览 2评论
379浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
461浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 18:23 , Processed in 0.986632 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号