OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3326|回复: 2

help 多路pwm信号芯片推荐

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2020-11-16
在线时间
6 小时
发表于 2020-12-22 09:34:51 | 显示全部楼层 |阅读模式
有没有大佬知道什么外设可以产生10路以上pwm信号
用来控制电调驱动电机
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3402

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8687
金钱
8687
注册时间
2020-5-11
在线时间
4170 小时
发表于 2020-12-22 11:26:07 | 显示全部楼层
本帖最后由 LcwSwust 于 2020-12-22 11:37 编辑

电调啊,STC15、STC8系列纯软件产生10路以上pwm信号是没问题的。
STM32更加没问题。
类似下面这种:
傲游截图20201222112212.jpg
,每个脉冲最宽2.5ms,8路刚好20ms(50Hz),就是说一个定时器就能轻松产生8路PWM,
两个定时器错开一定相位就能产生16路PWM。
顺便添加一点我的代码,利用PCA定时器模式实现:
  1. //--------------------------------------------------
  2. //CCF0\CCF1分别错开5us避免同时中断
  3. //分别产生8路PCA,共16路
  4. //--------------------------------------------------
  5. void pca_isr(void) interrupt 7  //using 2
  6. {
  7.         static U8 s0=0,s1=0,sn0=0,sn1=0;
  8.         static U8 th0=0,th1=0;
  9.         static U16        pcmp0=0,pcmp1=0;
  10.         static U8 n;
  11.         U16 temp;

  12.         if(CCF0)
  13.         {
  14.                 CCF0=0;
  15.                 s0=(s0+1)&1;
  16.                 if(s0)//输出高电平
  17.                 {
  18.                         sn0=sn0+1;
  19.                         if(sn0>7)sn0=0;
  20.                         switch(sn0)
  21.                         {
  22.                                 case 0:PPMA1_H;th0=ppw_a[0];break;//PPMA1输出高电平
  23.                                 case 1:PPMA2_H;th0=ppw_a[1];break;
  24.                                 case 2:PPMA3_H;th0=ppw_a[2];break;
  25.                                 case 3:PPMA4_H;th0=ppw_a[3];break;
  26.                                 case 4:PPMB1_H;th0=ppw_b[0];break;//PPMB1输出高电平
  27.                                 case 5:PPMB2_H;th0=ppw_b[1];break;
  28.                                 case 6:PPMB3_H;th0=ppw_b[2];break;
  29.                                 case 7:PPMB4_H;th0=ppw_b[3];break;
  30.                         }
  31.                         //if(th0<50)th0=50;
  32.                         //if(th0>240)th0=240;
  33.                         VLIM(th0,100,200);
  34.                         temp=th0;
  35.                 }
  36.                 else//输出低电平
  37.                 {
  38.                         PPMA1_L;PPMA2_L;PPMA3_L;PPMA4_L;
  39.                         PPMB1_L;PPMB2_L;PPMB3_L;PPMB4_L;
  40.                         temp=250-th0;

  41.                 }
  42.                 pcmp0+=temp*10;//10微秒单位
  43.                 CCAP0L=pcmp0;
  44.                 CCAP0H=pcmp0>>8;

  45.         }
  46.         if(CCF1)
  47.         {
  48.                 CCF1=0;
  49.                 s1=(s1+1)&1;
  50.                 if(s1)//输出高电平
  51.                 {
  52.                         sn1=sn1+1;
  53.                         if(sn1>7)sn1=0;
  54.                         switch(sn1)
  55.                         {
  56.                                 case 0:PPMC1_H;th1=ppw_c[0];break;//PPMC1输出高电平
  57.                                 case 1:PPMC2_H;th1=ppw_c[1];break;
  58.                                 case 2:PPMC3_H;th1=ppw_c[2];break;
  59.                                 case 3:PPMC4_H;th1=ppw_c[3];break;
  60.                                 case 4:PPMD1_H;th1=ppw_d[0];break;//PPMD1输出高电平
  61.                                 case 5:PPMD2_H;th1=ppw_d[1];break;
  62.                                 case 6:PPMD3_H;th1=ppw_d[2];break;
  63.                                 case 7:PPMD4_H;th1=ppw_d[3];break;
  64.                         }
  65.                         //if(th1<50)th1=50;
  66.                         //if(th1>240)th1=240;
  67.                         VLIM(th1,100,200);
  68.                         temp=th1;
  69.                 }
  70.                 else//输出低电平
  71.                 {
  72.                         PPMC1_L;PPMC2_L;PPMC3_L;PPMC4_L;
  73.                         PPMD1_L;PPMD2_L;PPMD3_L;PPMD4_L;
  74.                         temp=250-th1;
  75.                         n++;
  76.                         if(n>=200)
  77.                         {
  78.                                 n=0;
  79.                                 LED_X;
  80.                         }
  81.                 }
  82.                 pcmp1+=temp*10+5;//10微秒单位,移相5微秒,避免两个中断同时发生
  83.                 CCAP1L=pcmp1;
  84.                 CCAP1H=pcmp1>>8;
  85.         }

  86. }
复制代码


专治疑难杂症
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1867
金钱
1867
注册时间
2019-9-19
在线时间
221 小时
发表于 2020-12-22 13:36:37 | 显示全部楼层
PCA9685本来是驱动LED灯的,也被拿来驱动电机了。另外还有类似的MBI5030,PCA9635,TLC5941等,都是16路,每一路可调的芯片。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 04:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表