应广单片机adc和pwm例程

         应广单片机Otp单核系列主要有以下几个系列,15x系列为纯iO,13x系列为带12bit的adc,17x系列为带8bit的adc,现在我用pms132B写个adc/pwm例程,方便大家快速上手.不多说,上代码.

#include    "extern.h"


/**********adc*****************/
Word usAdcSum;
Word usAdcSumBak;

BIT        THR             :PB.0;
BIT        PWM             :PA.3;
/*定时器初始化*/
void PwmTmr2Init ( void )
{
    tm2ct = 0x0;/*计数值*/
    //pwm duty
    tm2b = 0;//START_PWM_CNT;
    //8 位 pwm, 预分频 = 64, 分频 = 2, frq=970hz
    tm2s = 0b0_11_00000;
    //0010=HIRC输出 ,01= PB2,10=PA3,11=PB4, PWM模式,禁用极性反转
    tm2c = 0b0010_10_1_0;
}

void GetAdc(void)    //ADC采样处理
{
     BYTE  ucCnt;
     
     $ ADCC Enable, THR    ;
     
     //8次采样做平均/
     ucCnt=8;
     //初始化
     usAdcSum=0;
     while ( ucCnt-- )
     {
         AD_Start=1;
        .wait1    AD_Done;
        //adc 采样值,12bit实际使用8bit
        usAdcSum +=ADCRH;
     }    
     //取平均值输出
     usAdcSum=usAdcSum>>3;  //temp除以8
}


void    FPPA0 (void)
{
    .ADJUST_IC    SYSCLK=IHRC/2        //    SYSCLK=IHRC/2

    //    Insert Initial Code
    $ THR  in;
    $ PWM  out,low;


    /*bit config start
    b7:5@001=2V参考;000=VDD;
    b4@0f通道选择器
    b3:2@f通道band-gap参考电压选择
    b1:0@00=rsv
    bit config end*/
    adcrgc=0b000_0_00_00;

    
    PwmTmr2Init();
    while (1)
    {
        /**/
        GetAdc();
        /*当pwm占空比为0,会有关不断的现象,要做特殊处理*/
        if(usAdcSumBak!=usAdcSum)
        {
            usAdcSumBak=usAdcSum;

           /*更新占空比*/
            tm2b=usAdcSum$0;

           /*pwm输出为0*/
            if(!usAdcSum$0)
            {

               /*关闭pwm输出*/
                tm2c = 0b0010_00_1_0;
                PWM=0;
            } 
            else
            {

               /*打开pwm输出*/
                tm2c = 0b0010_10_1_0;
            }
        }

    }
}


void    Interrupt (void)
{
    pushaf;

    if (Intrq.T16)
    {    //    T16 Trig
        //    User can add code
        Intrq.T16    =    0;
        //...
    }

    popaf;
}

/*有啥问题可以留言,也可以联系本人QQ85547259*/

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页