我的最终目的是要控制电机(玩具电梯),所以通过PWM调速还是很有必要的。
设定周期为10ms。实现10%~90%(
占空比变化率为10%)总共九种占空比的波形输出。
实现思路,通过定时器计数,通过到达设定值时翻转实现IO实现PWM占空比可调。
上图为脱机运行实物图。使用逻辑分析仪测试PWM。
占空比变化最小单位为10%,实现10%~90%之间可调。
K1按键: 增加占空比
K5按键: 减小占空比
P01 输出PWM波形
PWM输出部分程序
- //中断子程序
- __interrupt void R_TAU0_Channel0_Interrupt(void)
- {
- /* Start user code. Do not edit comment generated here */
- Key_Scan();
- LED_Display();
- /* End user code. Do not edit comment generated here */
- }
-
- __interrupt void R_TAU0_Channel1_Interrupt(void)
- {
- num++;
- if(num > 9)
- {
- num = 0;
- P0 &= 0xFD;
- }
- else if(num == (10 - speed))
- P0 |= 0x02;
- TDR01H = 0x04; //1ms
- TDR01L = 0xE2;
- }
使用了两个定时器。一个定时器负责按键识别及数码管刷新。另一个定时器负责PWM输出。
- //定时器初始化。
- //timer00定时间隔4ms,用于按键识别及数码管刷新
- //timer01定时间隔1ms,用于PWM输出
- void TAU0_Init(void)
- {
- TAU0EN = 1; /*supply input clock*/
- TPS0 = 0x04; /*CK00,CK01 fMCLK=fCLK/16=1.25MH,¨fCLK=20MHz*/
-
- /* channel 0 and 1 used as interval timer */
- TMR00H = 0; /*only software trigger*/
- TMR00L = 0;
- TMR01H = 0; /*only software trigger*/
- TMR01L = 0;
- TDR00H = 0x14; /*4ms*/
- TDR00L = 0x2A;
- TDR01H = 0x04; /*1ms*/
- TDR01L = 0xE2;
- TMIF00 = 0; /*Clear channel0 interrupt flag */
- TMIF01 = 0; /*Clear channel1 interrupt flag */
- }
PWM演示视频
PWM演示程序
PWM.zip
(150.35 KB)
(下载次数: 11, 2015-10-13 15:47 上传)
PWM.zip
(150.35 KB)
(下载次数: 11, 2015-10-13 15:47 上传)
本帖最后由 ltbytyn 于 2015-10-13 15:54 编辑