本人想通过STM8S 单片机的控制LED,实现火焰的效果。但是STM8S的寄存器PWM IO口有限,还得自己模拟十几路的PWM。但是我在模拟的时候,老是调不到稳定的PWM,偶尔带有一些抖动的情况。
我是利用一个定时器,然后在定时中断中放置一个变量++,模拟PWM的时间计数,然后再在While(1) 中通过标志位调节占空比, 最后占空比和计数值作比较控制IO的翻转。
求助高手们,如何能把模拟PWM的抖动降低到人眼分辨不出来呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
用逻辑分析仪测量每路波形,然后对比误差。
- void Set_Pin(DIS_PART_TYPE i,SWITCH_TYPE sw) // LED端口输出
- {
- if(sw==TRUE) // 开
- {
- switch(i)
- {
- case LED_P_1 : Pin(LED_08,OUT_1);Pin(LED_24,OUT_1); break;
- case LED_P_2 : Pin(LED_09,OUT_1);Pin(LED_25,OUT_1); break;
- case LED_P_3 : Pin(LED_10,OUT_1);Pin(LED_26,OUT_1); break;
- case LED_P_4 : Pin(LED_11,OUT_1);Pin(LED_27,OUT_1); break;
- case LED_P_5 : Pin(LED_12,OUT_1);Pin(LED_28,OUT_1); break;
- case LED_P_6 : Pin(LED_13,OUT_1);Pin(LED_29,OUT_1); break;
- case LED_P_7 : Pin(LED_14,OUT_1);Pin(LED_30,OUT_1); break;
- case LED_P_8 : Pin(LED_15,OUT_1);Pin(LED_31,OUT_1); break;
- case LED_P_9 : Pin(LED_16,OUT_1);Pin(LED_32,OUT_1); break;
- case LED_P_10 : Pin(LED_17,OUT_1);Pin(LED_33,OUT_1); break;
- case LED_P_11 : Pin(LED_18,OUT_1);Pin(LED_34,OUT_1); break;
- case LED_P_12 : Pin(LED_19,OUT_1);Pin(LED_35,OUT_1); break;
- case LED_P_13 : Pin(LED_20,OUT_1);Pin(LED_36,OUT_1); break;
- case LED_P_14 : Pin(LED_21,OUT_1);Pin(LED_37,OUT_1); break;
- case LED_PWR: Pin(LED_KEY,OUT_1); break;
- default : break;
- }
- }
- else // 关
- {
- switch(i)
- {
- case LED_P_1 : Pin(LED_08,OUT_0);Pin(LED_24,OUT_0); break;
- case LED_P_2 : Pin(LED_09,OUT_0);Pin(LED_25,OUT_0); break;
- case LED_P_3 : Pin(LED_10,OUT_0);Pin(LED_26,OUT_0); break;
- case LED_P_4 : Pin(LED_11,OUT_0);Pin(LED_27,OUT_0); break;
- case LED_P_5 : Pin(LED_12,OUT_0);Pin(LED_28,OUT_0); break;
- case LED_P_6 : Pin(LED_13,OUT_0);Pin(LED_29,OUT_0); break;
- case LED_P_7 : Pin(LED_14,OUT_0);Pin(LED_30,OUT_0); break;
- case LED_P_8 : Pin(LED_15,OUT_0);Pin(LED_31,OUT_0); break;
- case LED_P_9 : Pin(LED_16,OUT_0);Pin(LED_32,OUT_0); break;
- case LED_P_10 : Pin(LED_17,OUT_0);Pin(LED_33,OUT_0); break;
- case LED_P_11 : Pin(LED_18,OUT_0);Pin(LED_34,OUT_0); break;
- case LED_P_12 : Pin(LED_19,OUT_0);Pin(LED_35,OUT_0); break;
- case LED_P_13 : Pin(LED_20,OUT_0);Pin(LED_36,OUT_0); break;
- case LED_P_14 : Pin(LED_21,OUT_0);Pin(LED_37,OUT_0); break;
- case LED_PWR: Pin(LED_KEY,OUT_0); break;
- default : break;
- }
- }
- }
- #pragma vector=System(TRB,VECTOR)
- __interrupt void System_TRB_Interrupt(void)
- {
- uchar i;
- System(TRB,RESET);
-
- for(i=0;i<sizeof(display.value);i++) // 输出LED
- {
- display.rate[i]++;
- if(display.rate[i]>FLASH_RATE[i]) // LED PWM输出频率
- {
- display.rate[i]=0;
- }
- if(display.value[i]>display.rate[i])
- {
- Set_Pin((DIS_PART_TYPE)(i),TRUE);
- }
- else
- {
- Set_Pin((DIS_PART_TYPE)(i),FALSE);
- }
- }
- }
复制代码十来二十路无压力。
一周热门 更多>