STM8S 如何模拟出稳定的多路PWM

2020-01-01 17:49发布


本人想通过STM8S 单片机的控制LED,实现火焰的效果。但是STM8S的寄存器PWM IO口有限,还得自己模拟十几路的PWM。但是我在模拟的时候,老是调不到稳定的PWM,偶尔带有一些抖动的情况。

我是利用一个定时器,然后在定时中断中放置一个变量++,模拟PWM的时间计数,然后再在While(1) 中通过标志位调节占空比,    最后占空比和计数值作比较控制IO的翻转。

求助高手们,如何能把模拟PWM的抖动降低到人眼分辨不出来呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
aozima
1楼-- · 2020-01-01 18:08
同一刻的硬件PWM看不出闪吗?在频率和占空比相同的情况下?
用逻辑分析仪测量每路波形,然后对比误差。
WATS
2楼-- · 2020-01-01 22:51
顶一个,,,,,,,,,,,
gy54321
3楼-- · 2020-01-02 00:47
 精彩回答 2  元偷偷看……
zysblog
4楼-- · 2020-01-02 03:31
直接在中断中进行端口翻转操作,在主程序中难免会出现抖动。
xld826
5楼-- · 2020-01-02 08:49
中断里做会稳定些,中断优先级设置最高
lianglee
6楼-- · 2020-01-02 12:03
  1. void Set_Pin(DIS_PART_TYPE i,SWITCH_TYPE sw)                        // LED端口输出
  2. {
  3.         if(sw==TRUE)        // 开
  4.         {
  5.                 switch(i)
  6.                 {
  7.                         case LED_P_1  : Pin(LED_08,OUT_1);Pin(LED_24,OUT_1); break;
  8.                         case LED_P_2  : Pin(LED_09,OUT_1);Pin(LED_25,OUT_1); break;
  9.                         case LED_P_3  : Pin(LED_10,OUT_1);Pin(LED_26,OUT_1); break;
  10.                         case LED_P_4  : Pin(LED_11,OUT_1);Pin(LED_27,OUT_1); break;
  11.                         case LED_P_5  : Pin(LED_12,OUT_1);Pin(LED_28,OUT_1); break;
  12.                         case LED_P_6  : Pin(LED_13,OUT_1);Pin(LED_29,OUT_1); break;
  13.                         case LED_P_7  : Pin(LED_14,OUT_1);Pin(LED_30,OUT_1); break;
  14.                         case LED_P_8  : Pin(LED_15,OUT_1);Pin(LED_31,OUT_1); break;
  15.                         case LED_P_9  : Pin(LED_16,OUT_1);Pin(LED_32,OUT_1); break;
  16.                         case LED_P_10 : Pin(LED_17,OUT_1);Pin(LED_33,OUT_1); break;
  17.                         case LED_P_11 : Pin(LED_18,OUT_1);Pin(LED_34,OUT_1); break;
  18.                         case LED_P_12 : Pin(LED_19,OUT_1);Pin(LED_35,OUT_1); break;
  19.                         case LED_P_13 : Pin(LED_20,OUT_1);Pin(LED_36,OUT_1); break;
  20.                         case LED_P_14 : Pin(LED_21,OUT_1);Pin(LED_37,OUT_1); break;
  21.                         case LED_PWR: Pin(LED_KEY,OUT_1); break;
  22.                         default : break;
  23.                 }
  24.         }
  25.         else                        // 关
  26.         {
  27.                 switch(i)
  28.                 {
  29.                         case LED_P_1  : Pin(LED_08,OUT_0);Pin(LED_24,OUT_0); break;
  30.                         case LED_P_2  : Pin(LED_09,OUT_0);Pin(LED_25,OUT_0); break;
  31.                         case LED_P_3  : Pin(LED_10,OUT_0);Pin(LED_26,OUT_0); break;
  32.                         case LED_P_4  : Pin(LED_11,OUT_0);Pin(LED_27,OUT_0); break;
  33.                         case LED_P_5  : Pin(LED_12,OUT_0);Pin(LED_28,OUT_0); break;
  34.                         case LED_P_6  : Pin(LED_13,OUT_0);Pin(LED_29,OUT_0); break;
  35.                         case LED_P_7  : Pin(LED_14,OUT_0);Pin(LED_30,OUT_0); break;
  36.                         case LED_P_8  : Pin(LED_15,OUT_0);Pin(LED_31,OUT_0); break;
  37.                         case LED_P_9  : Pin(LED_16,OUT_0);Pin(LED_32,OUT_0); break;
  38.                         case LED_P_10 : Pin(LED_17,OUT_0);Pin(LED_33,OUT_0); break;
  39.                         case LED_P_11 : Pin(LED_18,OUT_0);Pin(LED_34,OUT_0); break;
  40.                         case LED_P_12 : Pin(LED_19,OUT_0);Pin(LED_35,OUT_0); break;
  41.                         case LED_P_13 : Pin(LED_20,OUT_0);Pin(LED_36,OUT_0); break;
  42.                         case LED_P_14 : Pin(LED_21,OUT_0);Pin(LED_37,OUT_0); break;
  43.                         case LED_PWR: Pin(LED_KEY,OUT_0); break;
  44.                         default : break;
  45.                 }
  46.         }
  47. }
  48. #pragma vector=System(TRB,VECTOR)
  49. __interrupt void System_TRB_Interrupt(void)
  50. {
  51.         uchar i;
  52.         System(TRB,RESET);
  53.        
  54.         for(i=0;i<sizeof(display.value);i++)        // 输出LED
  55.         {
  56.                 display.rate[i]++;
  57.                 if(display.rate[i]>FLASH_RATE[i])                // LED PWM输出频率
  58.                 {
  59.                         display.rate[i]=0;
  60.                 }
  61.                 if(display.value[i]>display.rate[i])
  62.                 {
  63.                         Set_Pin((DIS_PART_TYPE)(i),TRUE);
  64.                 }
  65.                 else
  66.                 {
  67.                         Set_Pin((DIS_PART_TYPE)(i),FALSE);
  68.                 }
  69.         }
  70. }
复制代码

十来二十路无压力。

一周热门 更多>