新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ATMEGA16 多通道AD采集

        ATMEGA16 多通道AD采集

        作者: 時間:2016-11-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/316564.htm

        //ADEN置位即啟動ADC ,否則ADC功能關閉。在轉換過程中關閉ADC將立即中止正在進行的轉換。同時ADEN清零會將ADIE(AD結束中斷使能)清除。另外工作在連續模式下如果沒有對ADEN清零則AD采樣一直運行。

        #include "main.h"

        #define HOT_MUX 4
        #define MIX_MUX 5
        #define POWER_MUX 7
        #define AD_PORT PORTA
        #define AD_DIR DDRA

        //采集次數
        #define HOT_SAMP_CNT 4
        #define MIX_SAMP_CNT 4
        #define POWER_SAMP_CNT 4

        unsigned char AD_READY = 0;
        volatile unsigned int buf[8];

        volatile unsigned int AD_hot_result = 0;
        volatile unsigned int AD_mix_result = 0;
        volatile unsigned int AD_power_result = 0;

        void ADC_Init(void)
        {
        AD_PORT &= ~(1<AD_DIR &= ~(1< ADMUX = (1<ACSR |= 0x80; //禁止模擬比較器
        SFIOR = 0x00; //連續轉換模式
        ADCSRA = (1<}

        #pragma interrupt_handler ADC_ISR:15
        void ADC_ISR(void)
        {
        unsigned int temp = 0;
        static unsigned int sum = 0;
        static unsigned char cnt = 0;
        static unsigned char AD_status = 0;

        if (cnt == 0) //切換通道時第一個數據必須舍棄
        {
        cnt = 1;
        ADCSR|=(1}

        temp = ADCL;
        temp |= (unsigned int)ADCH<<8;
        sum += temp;

        switch(AD_status)
        {
        case 0:

        if (++cnt > HOT_SAMP_CNT)
        {
        AD_status++;
        ADMUX = (1<AD_hot_result = sum / HOT_SAMP_CNT;
        cnt = 0;
        sum = 0;
        }
        break;
        case 1:

        if (++cnt > MIX_SAMP_CNT)
        {
        AD_status++;
        ADMUX = (1<AD_mix_result = sum / MIX_SAMP_CNT;
        cnt = 0;
        sum = 0;
        }
        break;
        case 2: //電源電壓
        if (++cnt > POWER_SAMP_CNT)
        {
        AD_status = 1;
        ADMUX = (1<AD_power_result = sum / POWER_SAMP_CNT;
        cnt = 0;
        sum = 0;
        AD_READY = 1;

        ADCSR &= ~(1}
        break;
        }
        ADCSR|=(1<}

        unsigned int Res_Matrixing_Temper(unsigned int temp)
        {
        float Rt = 0;
        float T_inv = 0;
        float temper = 0;

        Rt = (float)50000*temp/(1024-temp);
        T_inv = log(Rt/50000)/3950 + 1/298.15;
        temper = (1/T_inv -273.15)*10 + 0.5;

        return ((unsigned int)temper);
        }

        void get_AD_result(void)
        {
        unsigned int t1 = 0;
        float T_inv = 0;
        float Rt = 0;
        float temp = 0;
        if (AD_READY == 1)
        {
        AD_READY = 0;

        t1 = Res_Matrixing_Temper(AD_hot_result);

        buf[0] = t1/100;
        buf[1] = t1/10%10;
        buf[2] = t1%10;

        t1 = Res_Matrixing_Temper(AD_mix_result);
        buf[3] = t1/100;
        buf[4] = t1/10%10;
        buf[5] = t1%10;

        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 读书| 临武县| 甘南县| 玉环县| 和田市| 奉新县| 五台县| 仁化县| 鹤庆县| 新闻| 繁峙县| 青岛市| 枝江市| 崇信县| 灵寿县| 会理县| 海丰县| 堆龙德庆县| 固始县| 东至县| 密云县| 道孚县| 上蔡县| 商南县| 枣庄市| 屏边| 昌邑市| 高陵县| 襄汾县| 疏附县| 东山县| 综艺| 阿拉善右旗| 寻甸| 盘山县| 安福县| 淳安县| 嘉鱼县| 蓬莱市| 莱州市| 张家港市|