微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 使用单片机自带AD转换采样电位器,进行PWM调光

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

时间:10-02 整理:3721RD 点击:

请问各位一下,AD转换结果,需要经过什么处理,,然后用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=(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]);PCA_PWM0=0x01;break;
                case 1:PCA_PWM0=0x00;pwm_set(PWM[1]);break;
                case 2:PCA_PWM0=0x00;pwm_set(PWM[2]);break;
                case 3:PCA_PWM0=0x00;pwm_set(PWM[3]);break;
                case 4:PCA_PWM0=0x00;pwm_set(PWM[4]);break;
                   case 5:PCA_PWM0=0x00;pwm_set(PWM[5]);break;
                case 6:PCA_PWM0=0x00;pwm_set(PWM[6]);break;
                case 7:PCA_PWM0=0x00;pwm_set(PWM[7]);break;
                }
        }
}

查了一下,,,一个完整的A/D转换过程中,必须包括取样、保持、量化与编码等几部分电路。这说的是软件呢还是硬件电路呢!有没有具体的程序参考一下呢,,,大神

哎,,,程序还没有弄好!有没有现成的电位器调光程序参考一下啊!现在我是采用间断判断电位器采样电压,来输出不同占空比的pwm...这样写有点缺陷就是当电位器调到关闭后,PWM输出为0!关闭电源再进行调节电位器的话,,有可能(电位器采样在断点电压)灯不亮。   感觉没法再修改了
void main()
{        
        //unsigned int i;//CCP0=0;        
//Error:        
        InitADC();        
        pwm_init();               
        while(1)
        {
            getadv=5*adhl2*12/1024;//getadv=50*adhl2/adhl1;//getadv=2.5*adhl2*0.5/adhl1;把getadv扩大40倍//*0.5软件处理把采样电压减半为满电压时2.5V;仿真时上来就是getadv=0xffff?
                //采样电压放在AD转换中断,待试
               
                //c=IapReadByte(IAP_ADDRESS);

                if(getadv<41)//1.5V//if(getadv<73)//1.5V
                {        if(IapReadByte(0x0400)==0)
                        goto SW;
                        else{c=0;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400,c);}
                }
                if(getadv>42&&getadv<44)
                {        if(IapReadByte(0x0400)==1)
                        goto SW;
                        else{c=1;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400,c);}        
                }     
                if(getadv>45&&getadv<47)
                {        if(IapReadByte(0x0400)==2)
                        goto SW;
                        else{c=2;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400,c);}
                }                                   
                if(getadv>48&&getadv<50)//1.5V//if(getadv>=73)
                {        if(IapReadByte(0x0400)==3)
                        goto SW;
                        else{c=3;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400, c);}
                }
                if(getadv>51&&getadv<53)
                {        if(IapReadByte(0x0400)==4)
                        goto SW;
                        else{c=4;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400, c);}
                }
                if(getadv>55&&getadv<57)//以前(getadv>54&&getadv<56)  4、5不稳
                {        if(IapReadByte(0x0400)==5)
                        goto SW;
                        else{c=5;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400, c);}
                }
                if(getadv>58)//以前(getadv>57)
                {        if(IapReadByte(0x0400)==6)
                        goto SW;
                        else{c=6;
                        IapEraseSector(0x0400);
                        /*for (i=0; i<1; i++)           //检测是否擦除成功(全FF检测)
                    {
                if (IapReadByte(IAP_ADDRESS+i) != 0xff)
            goto Error;             //如果出错,则退出
                    } */
                        IapProgramByte(0x0400, c);}
                }
                //if(getadv>59)//1.5V//if(getadv>=73)
                //{c=7;}
                //if(getadv>59)//1.5V//if(getadv>=73)
                //{c=4;}                 
     SW:switch(IapReadByte(0x0400))//(c=IapReadByte(0x0400))
                {
                case 0:pwm_set(PWM[0]);PCA_PWM0=0x01;break;
                case 1:PCA_PWM0=0x00;pwm_set(PWM[1]);break;
                case 2:PCA_PWM0=0x00;pwm_set(PWM[2]);break;
                case 3:PCA_PWM0=0x00;pwm_set(PWM[3]);break;
                case 4:PCA_PWM0=0x00;pwm_set(PWM[4]);break;
                   case 5:PCA_PWM0=0x00;pwm_set(PWM[5]);break;
                case 6:PCA_PWM0=0x00;pwm_set(PWM[6]);break;
                //case 7:PCA_PWM0=0x00;pwm_set(PWM[7]);break;
                }
                //IapEraseSector(IAP_ADDRESS);    //扇区擦除
            //for (i=0; i<512; i++)           //检测是否擦除成功(全FF检测)
            //{
                //if (IapReadByte(IAP_ADDRESS+i) != 0xff)
           // goto Error;             //如果出错,则退出
                   //}
                //IapProgramByte(IAP_ADDRESS, c);
        }


}

一个完整的A/D转换过程中,必须包括取样、保持、量化与编码等几部分电路

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top