開發平臺
- Board:野火RT1052-MINI
- IDE:Keil 5.28
關於RT1052上的ADC
從官方手冊來看,
RT1052上的ADC性能並不小。
ADC的初始化代碼:
bool Adc_Init(void)
{
gpio_pin_config_t Config;
adc_config_t config;
adc_channel_config_t ADC_CH_config;
/*
* GPIO 配置爲輸入模式
* 不使用中斷
*/
Config.direction = kGPIO_DigitalInput;
Config.interruptMode = kGPIO_NoIntmode;
GPIO_PinInit(ADC_GPIO, ADC_PIN, &Config);
/*
* GPIO 複用配置
* PAD配置
*/
IOMUXC_SetPinMux(ADC_MUX,0);
IOMUXC_SetPinConfig(ADC_MUX,ADC_PAD_CONFIG_DATA);
/*
* 獲取ADC默認配置
* 初始化ADC
* 失能硬件觸發模式
* 配置硬件平均
*/
ADC_GetDefaultConfig(&config);
config.enableContinuousConversion = true;
ADC_Init(ADCx, &config);
ADC_EnableHardwareTrigger(ADCx,false);
ADC_SetHardwareAverageConfig(ADCx, kADC_HardwareAverageCount32);
/*
* ADC通道配置
* 使能中斷完成轉化
* 初始化通道配置
*/
ADC_CH_config.channelNumber = ADC_Channel;
ADC_CH_config.enableInterruptOnConversionCompleted = true;
ADC_SetChannelConfig(ADCx,ADC_GROUP,&ADC_CH_config);
if(ADC_DoAutoCalibration(ADCx)==kStatus_Success)
{
PRINTF("ADC校正完成\n");
}
else
{
PRINTF("ADC校正失敗\n");
}
return true;
}
值得注意的是,如果將ADC_EnableHardwareTrigger(ADCx,false);
改爲開啓,那ADC的值會一直停留不變,反正我也很鬱悶,搞了半天才知道這個問題。因爲之前都是用中斷的方式採集的,但是我之前開了也能正常採集。
ADC獲取值:
uint32_t ADC_Get(void)
{
adc_channel_config_t adcChannelConfigStruct;
adcChannelConfigStruct.channelNumber = ADC_Channel;
adcChannelConfigStruct.enableInterruptOnConversionCompleted = true;
ADC_SetChannelConfig(ADCx, ADC_GROUP, &adcChannelConfigStruct);
return ADC_GetChannelConversionValue(ADCx,ADC_Channel);
}
如果沒有開啓連續採樣模式,就必須每次都執行一遍ADC_SetChannelConfig()這個函數,開啓之後可以不執行直接獲取。
ADC的轉換公式:
X/3.3 = data/2^N
X是所要求的電壓值。
data是ADC得到的原始數據。
N是ADC的位數,8位、10位、12位。