打印
[STC单片机]

使用单片机自带AD转换采样电位器,进行PWM调光

[复制链接]
3658|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhang154|  楼主 | 2015-6-24 09:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问各位一下,AD转换结果,需要经过什么处理,,然后用if语句判断输出不同占空比的PWM..........
写了这样的一段程序,,为什么会在if语句的连续判断点处,,,灯光会闪。。。。应该怎么写呢?请赐教
电位器采样电压用示波器看了,,很稳定。。。。但是PWM波形在if语句的连续判断点处闪,,到底为什么呢
unsigned int Average()
{
        unsigned int sum=0,min,max=min=ADC_data[0];
        unsigned int m;
        for(m=0;m<10;m++)
        {
                sum+=ADC_data[m];
                if(ADC_data[m]<min)                min=ADC_data[m];
                if(ADC_data[m]>max)                max=ADC_data[m];
        }
        sum=(sum-min-max)>>3;
        return sum;
}
void adc_it() interrupt 5//分辨率2.44mv
{
        ADC_CONTR&=~ADC_FLAG;
        //if(t==0)
        ADC_data[i]=(ADC_RES*4+ADC_RESL);//adhl2=(ADC_RES*4+ADC_RESL);//读取10位通道4的AD转换结果
        i++;
        
        if(i>=10)
        {        EADC=0;
                i=0;
                adhl2=Average();
                EADC=1;
                }
        ADC_RES=0;ADC_RESL=0;
        ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START|ch;        
}


void main()
{        //P1=0x00;
        //CCP0=0;
        InitADC();        
        pwm_init();        
        while(1)
        {
            getadv=5*adhl2*12/1024;

            if(getadv<=41)  c=0;
                if(getadv>41&&getadv<=44)        c=1;
                if(getadv>44&&getadv<=47)        c=2;
                if(getadv>47&&getadv<=50)        c=3;
                if(getadv>50&&getadv<=53)        c=4;
                if(getadv>53&&getadv<=56)        c=5;
                if(getadv>56)                                c=6;
              switch(c)
                {
                case 0:pwm_set(PWM[0])CA_PWM0=0x01;break;
                case 1:CA_PWM0=0x00;pwm_set(PWM[1]);break;
                case 2:CA_PWM0=0x00;pwm_set(PWM[2]);break;
                case 3:CA_PWM0=0x00;pwm_set(PWM[3]);break;
                case 4:CA_PWM0=0x00;pwm_set(PWM[4]);break;
                   case 5:CA_PWM0=0x00;pwm_set(PWM[5]);break;
                case 6:CA_PWM0=0x00;pwm_set(PWM[6]);break;
                case 7:CA_PWM0=0x00;pwm_set(PWM[7]);break;
                }
        }
}

相关帖子

沙发
armxu| | 2015-8-8 19:11 | 只看该作者
我在做手柄控制电机PWM调速,也遇到类似的问题。手柄在零位静止时AD转换出的数据都有区别的,不知道如何稳定AD输出??

使用特权

评论回复
板凳
努力的微笑| | 2015-8-23 21:23 | 只看该作者
armxu 发表于 2015-8-8 19:11
我在做手柄控制电机PWM调速,也遇到类似的问题。手柄在零位静止时AD转换出的数据都有区别的,不知道如何稳 ...

小弟不才 前来献个丑  首先说一下 这个程序不是我编写的 是借鉴一位前辈的经验  
先假设pwm的分辨率很高 加1与减1对电机的影响可以忽略不计 那么看看这样是否可行

程序的pwm值在没有按键的时候始终进行自加1自减1的运算
如果需要调速以后锁定pwm 那么需要改写一下
并不太清除你的程序是什么 所以就帮不上更多了
我也是个新手希望大家能一起相互探讨共同进步

#include<reg51.h>
#include<intrins.h>
sbit k1=增加速度
sbit k2=减少速度
unsigned char PWM=0x7f ; //初值

void beep();    //pwm为最大或最小时发出声音提示
void delayms(unsigned char ms);
void main()
{   
        TMOD=0x21 ;
        TH0=0xfc ;           //1ms延时常数
        TL0=0x66 ;           //频率调节
        TH1=PWM ;            //脉宽调节
        TL1=0 ;
        EA=1;
        ET0=1;
        ET1=1;
       TR0=1 ;
while(1)
   {
        do{
            if(PWM!=0xff)
                  {
                           PWM++ ;
                           delayms(10);
                   }
            else beep() ;
          }
         while(K1==0);

        do{
                  if(PWM!=0x02)
                  {
                        PWM-- ;
                        delayms(10);
                   }
                 else Beep() ;
          }
           while(K2==0);
}


void timer0() interrupt 1
{  
    TR1=0 ;
    TH0=0xfc ;
    TL0=0x66 ;
    TH1=PWM ;
    TR1=1 ;
    P1=0x00 ;      //启动输出
}


void timer1() interrupt 3
{
    TR1=0 ;
    P1=0xff ;     //结束输出
}


void Beep()     
  {
    unsigned char i  ;
    for (i=0  ;i<100  ;i++)
      {
        delay(100)  ;
        BEEP=!BEEP  ;                //Beep取反
      }
    BEEP=1  ;                        //关闭蜂鸣器
        delay(1000);
  }


void delay(unsigned char t)
{
   while(t--)   ;
}

使用特权

评论回复
地板
zhang154|  楼主 | 2015-11-20 10:32 | 只看该作者
armxu 发表于 2015-8-8 19:11
我在做手柄控制电机PWM调速,也遇到类似的问题。手柄在零位静止时AD转换出的数据都有区别的,不知道如何稳 ...

后来你解决了吗?我现在有了一个新方法,,,原理就是ad采集两个值,然和进行比较。。。。大范围的话就把值去掉。。。。只留下小范围的,,,但是也有缺陷。。。。哎!!!还未能解决

使用特权

评论回复
5
zhang154|  楼主 | 2015-11-20 10:40 | 只看该作者
努力的微笑 发表于 2015-8-23 21:23
小弟不才 前来献个丑  首先说一下 这个程序不是我编写的 是借鉴一位前辈的经验  
先假设pwm的分辨率很高  ...

单独PWM波形的话,,没什么大问题!主要是AD采样的结果不太稳定,,会有跳变。。。然后根据AD采样值输出PWM....导致PWM输出不稳定了!你有何好的建议啊

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝