打印

51单片机输出多路pwm,一些问题,求解决办法

[复制链接]
6972|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angler001|  楼主 | 2011-11-4 12:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,现晶振为12MHZ,部分程序如下:

sbit pwm_out0= P1^0;
sbit pwm_out1 = P1^1;
sbit pwm_out2 = P1^2;
sbit pwm_out3 = P1^3;
sbit pwm_out4 = P1^4;
sbit pwm_out5 = P1^5;
sbit pwm_out6 = P2^0;
sbit pwm_out7 = P2^1;
sbit pwm_out8 = P2^2 ;
sbit pwm_out9 = P2^3 ;
sbit pwm_out10 = P2^4;
sbit pwm_out11 = P2^5 ;

void PWM()
{
    unsigned char i;
    if(pwm_base<33)                //基值在32次范围内比较循环12次,节约时间,第32次必为低,锁存
    {
        for(i=0;i<12;i++)         //循环12次
        {
      if(pwm_base>pwm_num[i])   //当基值小于阈值时,pwm输出高电平,
                pwm_out[i]=0;      
      else
         pwm_out[i]=0;        //否则,当基值大于或等于阈值时,输出pwm的低电平
        }
     pwm_out0 = pwm_out[0];
        pwm_out1 = pwm_out[1];
        pwm_out2 = pwm_out[2];
        pwm_out3 = pwm_out[3];
        pwm_out4 = pwm_out[4];
        pwm_out5 = pwm_out[5];
  
        pwm_out6 = pwm_out[6];
        pwm_out7 = pwm_out[7];
        pwm_out8 = pwm_out[8];
        pwm_out9 = pwm_out[9];
        pwm_out10 = pwm_out[10];
        pwm_out11 = pwm_out[11];
     
    }
      
    if(pwm_base>254)               //大于255即256次后,计数基值置0
        pwm_base=0;
}


void LED_t1() interrupt 3
{
  
  TH1 = (65536-70)/256;   //设置初值
  TL1 = (65536-70)%256;
  ET1 = 0;
  pwm_base++;
  ET1 = 1;
}


定时器定时为70us,需要在70us内完成一次PWM函数的计算,但是在12MHZ晶振时执行一次PWM();最少需要300us的时间。所以,必然会使输出的PWM不准确。
求改进方法……换晶振?改程序?

相关帖子

沙发
rclong| | 2011-11-4 14:04 | 只看该作者
51就是这水平了

使用特权

评论回复
板凳
ayb_ice| | 2011-11-4 14:14 | 只看该作者
难为标准51了

使用特权

评论回复
地板
angler001|  楼主 | 2011-11-4 20:19 | 只看该作者
额,那怎么办啊,换单片机吗?我只用过51啊,用什么合适啊。AT89s52的晶振最大能弄多大?

使用特权

评论回复
5
aukey| | 2011-11-4 20:53 | 只看该作者
换个 单片机 12c5a60s2 提高晶振 没别的法子,时间太短了

使用特权

评论回复
6
aukey| | 2011-11-4 20:53 | 只看该作者
换个 单片机 12c5a60s2 提高晶振 没别的法子,时间太短了

使用特权

评论回复
7
aukey| | 2011-11-4 21:06 | 只看该作者
单片机 12c5a60s2  最高支持 35m 的 我用过32m来试验 可以

使用特权

评论回复
8
angler001|  楼主 | 2011-11-4 21:09 | 只看该作者
问题解决了,换了下语句,差不多算是解决了,然后想再换个稍微大一点的晶振,22.118400的,保险点,还能做串口通信。

PWM函数重新写了,如下,这样,每次判断,生成的汇编一共5条,5us的时间(12MHZ)一共大概用80us,勉强可以了。

void PWM()
{
if(pwm_base>pwm_num[0])  pwm_out0 = 0;
  if(pwm_base>pwm_num[1])  pwm_out1 = 0;
  if(pwm_base>pwm_num[2])  pwm_out2 = 0;
  if(pwm_base>pwm_num[3])  pwm_out3 = 0;
  if(pwm_base>pwm_num[4])  pwm_out4 = 0;
  if(pwm_base>pwm_num[5])  pwm_out5 = 0;
  if(pwm_base>pwm_num[6])  pwm_out6 = 0;
  if(pwm_base>pwm_num[7])  pwm_out7 = 0;
  if(pwm_base>pwm_num[8])  pwm_out8 = 0;
  if(pwm_base>pwm_num[9])  pwm_out9 = 0;
  if(pwm_base>pwm_num[10])  pwm_out10 = 0;
  if(pwm_base>pwm_num[11])  pwm_out11 = 0;
  if(pwm_base>5)
  {
    pwm_base = 0;
        P1 = 0xff;
        P2 = 0xff;
  }
}

使用特权

评论回复
9
yinyejunjob| | 2012-10-10 00:55 | 只看该作者
我知道款21路10位PWM单片机,有兴趣可加我Q:1364494484

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

34

帖子

1

粉丝