论坛元老
 
- 积分
- 8687
- 金钱
- 8687
- 注册时间
- 2020-5-11
- 在线时间
- 4170 小时
|
发表于 2020-12-22 11:26:07
|
显示全部楼层
本帖最后由 LcwSwust 于 2020-12-22 11:37 编辑
电调啊,STC15、STC8系列纯软件产生10路以上pwm信号是没问题的。
STM32更加没问题。
类似下面这种:
,每个脉冲最宽2.5ms,8路刚好20ms(50Hz),就是说一个定时器就能轻松产生8路PWM,
两个定时器错开一定相位就能产生16路PWM。
顺便添加一点我的代码,利用PCA定时器模式实现:
- //--------------------------------------------------
- //CCF0\CCF1分别错开5us避免同时中断
- //分别产生8路PCA,共16路
- //--------------------------------------------------
- void pca_isr(void) interrupt 7 //using 2
- {
- static U8 s0=0,s1=0,sn0=0,sn1=0;
- static U8 th0=0,th1=0;
- static U16 pcmp0=0,pcmp1=0;
- static U8 n;
- U16 temp;
- if(CCF0)
- {
- CCF0=0;
- s0=(s0+1)&1;
- if(s0)//输出高电平
- {
- sn0=sn0+1;
- if(sn0>7)sn0=0;
- switch(sn0)
- {
- case 0:PPMA1_H;th0=ppw_a[0];break;//PPMA1输出高电平
- case 1:PPMA2_H;th0=ppw_a[1];break;
- case 2:PPMA3_H;th0=ppw_a[2];break;
- case 3:PPMA4_H;th0=ppw_a[3];break;
- case 4:PPMB1_H;th0=ppw_b[0];break;//PPMB1输出高电平
- case 5:PPMB2_H;th0=ppw_b[1];break;
- case 6:PPMB3_H;th0=ppw_b[2];break;
- case 7:PPMB4_H;th0=ppw_b[3];break;
- }
- //if(th0<50)th0=50;
- //if(th0>240)th0=240;
- VLIM(th0,100,200);
- temp=th0;
- }
- else//输出低电平
- {
- PPMA1_L;PPMA2_L;PPMA3_L;PPMA4_L;
- PPMB1_L;PPMB2_L;PPMB3_L;PPMB4_L;
- temp=250-th0;
- }
- pcmp0+=temp*10;//10微秒单位
- CCAP0L=pcmp0;
- CCAP0H=pcmp0>>8;
- }
- if(CCF1)
- {
- CCF1=0;
- s1=(s1+1)&1;
- if(s1)//输出高电平
- {
- sn1=sn1+1;
- if(sn1>7)sn1=0;
- switch(sn1)
- {
- case 0:PPMC1_H;th1=ppw_c[0];break;//PPMC1输出高电平
- case 1:PPMC2_H;th1=ppw_c[1];break;
- case 2:PPMC3_H;th1=ppw_c[2];break;
- case 3:PPMC4_H;th1=ppw_c[3];break;
- case 4:PPMD1_H;th1=ppw_d[0];break;//PPMD1输出高电平
- case 5:PPMD2_H;th1=ppw_d[1];break;
- case 6:PPMD3_H;th1=ppw_d[2];break;
- case 7:PPMD4_H;th1=ppw_d[3];break;
- }
- //if(th1<50)th1=50;
- //if(th1>240)th1=240;
- VLIM(th1,100,200);
- temp=th1;
- }
- else//输出低电平
- {
- PPMC1_L;PPMC2_L;PPMC3_L;PPMC4_L;
- PPMD1_L;PPMD2_L;PPMD3_L;PPMD4_L;
- temp=250-th1;
- n++;
- if(n>=200)
- {
- n=0;
- LED_X;
- }
- }
- pcmp1+=temp*10+5;//10微秒单位,移相5微秒,避免两个中断同时发生
- CCAP1L=pcmp1;
- CCAP1H=pcmp1>>8;
- }
- }
复制代码
|
|