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; } } }