單片機TM4C123學習(十):ADC采樣模塊


1.頭文件

#include "tiva_adc.h"                // ADC

2.引腳

3.初始化

// ADC初始化
// 光敏電阻(PE0)為通道3,存在序列0中,硬件平均為8個點
adc_init(TIVA_ADC1 , Channel_3, Sequence0, GPIOE, Pin0, 8);

  // 滑動變阻器為通道2
  adc_init(TIVA_ADC1 , Channel_2, Sequence1, GPIOE, Pin1, 8);

//具體函數內容
//channel:0-11
//sequence:0-3
void adc_init(uint32_t adc, uint32_t channel, uint32_t sequence, uint32_t GPIO, uint32_t PIN, int average_num) { //參數轉換 uint32_t adc_base; uint32_t adc_gpio; //選擇ADC0或ADC1 if(adc == TIVA_ADC0) adc_base = ADC0_BASE; else if(adc == TIVA_ADC1) adc_base = ADC1_BASE; //選擇GPIO switch(GPIO) { case GPIOA:{adc_gpio = SYSCTL_PERIPH_GPIOA;break;} case GPIOB:{adc_gpio = SYSCTL_PERIPH_GPIOB;break;} case GPIOC:{adc_gpio = SYSCTL_PERIPH_GPIOC;break;} case GPIOD:{adc_gpio = SYSCTL_PERIPH_GPIOD;break;} case GPIOE:{adc_gpio = SYSCTL_PERIPH_GPIOE;break;} case GPIOF:{adc_gpio = SYSCTL_PERIPH_GPIOF;break;} } SysCtlPeripheralEnable(adc); // 開ADC0/ADC1 GPIOPinTypeADC(GPIO, PIN); // 選擇管腳 // 開啟ADC // adc:ADC0 或 ADC1 // sequence: 選擇序列 // 最后一個參數:優先級 ADCSequenceConfigure(adc_base, sequence, ADC_TRIGGER_PROCESSOR, 0); ADCHardwareOversampleConfigure(adc_base, average_num); // 設置硬件8個數取一次均值 ADCSequenceStepConfigure(adc_base, sequence, 0, channel | ADC_CTL_IE | ADC_CTL_END); // 使能ADCx sequencex 中斷 if(adc == TIVA_ADC0) ADCIntRegister(adc_base, sequence, ADC0Handler); else ADCIntRegister(adc_base, sequence, ADC1Handler); ADCIntEnable(adc_base, sequence); if(adc == TIVA_ADC0) // ADC0 { switch(sequence) { case 0:IntEnable(INT_ADC0SS0);break; case 1:IntEnable(INT_ADC0SS1);break; case 2:IntEnable(INT_ADC0SS2);break; case 3:IntEnable(INT_ADC0SS3);break; } } else // ADC1 { switch(sequence) { case 0:IntEnable(INT_ADC1SS0);break; case 1:IntEnable(INT_ADC1SS1);break; case 2:IntEnable(INT_ADC1SS2);break; case 3:IntEnable(INT_ADC1SS3);break; } } ADCSequenceEnable(adc_base, sequence); // 通道配置好之后進行只能 ADCIntClear(adc_base, sequence); // 清除中斷標志 }

4.獲取采樣值

// 獲取采樣值,0-4095,對應0-3.3V
    adc_val = adc_get_value(TIVA_ADC1, Sequence0)*3.3/4096;

// 具體函數內容

uint16_t adc_get_value(uint32_t adc, uint8_t sequence)
{
    if(adc == TIVA_ADC0)    // ADC0
    {
        ADCProcessorTrigger(ADC0_BASE, sequence);
        switch(sequence)
        {
            case Sequence0:    return ADC0_sequence0_value;
            case Sequence1:    return ADC0_sequence1_value;
            case Sequence2:    return ADC0_sequence2_value;
            case Sequence3:    return ADC0_sequence3_value;
            default:                 return 0;
        }
    }
    else                                    // ADC1
    {
        ADCProcessorTrigger(ADC1_BASE, sequence);
        switch(sequence)
        {
            case Sequence0:    return ADC1_sequence0_value;
            case Sequence1:    return ADC1_sequence1_value;
            case Sequence2:    return ADC1_sequence2_value;
            case Sequence3:    return ADC1_sequence3_value;
            default:                 return 0;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM