开发平台
- 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位。