智能车学习日记(一)adc_demo
1.adc_init函数
adc初始化,需要规定adc通道
adc_init(ADC_0, ADC0_CH0_A0);//初始化ADC0 通道0 使用A0引脚
void adc_init(VADCN_enum vadc_n, VADC_CHN_enum vadc_chn)
{
static uint8 mudule_init_flag = 0;
IfxVadc_Adc vadc;
IfxVadc_Adc_Group adcGroup;
IfxVadc_Adc_Config adcConfig;
IfxVadc_Adc_initModuleConfig(&adcConfig, &MODULE_VADC);
if(!mudule_init_flag)
{
mudule_init_flag = 1;
IfxVadc_Adc_initModule(&vadc, &adcConfig);
}
else
{
vadc.vadc = adcConfig.vadc;
}
IfxVadc_Adc_GroupConfig adcGroupConfig;
IfxVadc_Adc_initGroupConfig(&adcGroupConfig, &vadc);
adcGroupConfig.groupId = (IfxVadc_GroupId)vadc_n;//IfxVadc_GroupId_0;
adcGroupConfig.master = adcGroupConfig.groupId;
adcGroupConfig.arbiter.requestSlotBackgroundScanEnabled = TRUE;
adcGroupConfig.backgroundScanRequest.autoBackgroundScanEnabled = TRUE;
adcGroupConfig.backgroundScanRequest.triggerConfig.gatingMode = IfxVadc_GatingMode_always;
adcGroupConfig.inputClass[0].resolution = IfxVadc_ChannelResolution_12bit;
adcGroupConfig.inputClass[0].sampleTime = 1.0f/ADC_SAMPLE_FREQUENCY;
adcGroupConfig.inputClass[1].resolution = IfxVadc_ChannelResolution_12bit;
adcGroupConfig.inputClass[1].sampleTime = 1.0f/ADC_SAMPLE_FREQUENCY;
IfxVadc_Adc_initGroup(&adcGroup, &adcGroupConfig);
IfxVadc_Adc_ChannelConfig adcChannelConfig;
IfxVadc_Adc_Channel adcChannel;
IfxVadc_Adc_initChannelConfig(&adcChannelConfig, &adcGroup);
adcChannelConfig.channelId = (IfxVadc_ChannelId)(vadc_chn%16);
adcChannelConfig.resultRegister = (IfxVadc_ChannelResult)(vadc_chn%16);
adcChannelConfig.backgroundChannel = TRUE;
IfxVadc_Adc_initChannel(&adcChannel, &adcChannelConfig);
unsigned channels = (1 << adcChannelConfig.channelId);
unsigned mask = channels;
IfxVadc_Adc_setBackgroundScan(&vadc, &adcGroup, channels, mask);
IfxVadc_Adc_startBackgroundScan(&vadc);
}
2.adc_convert函数
进行一次adc转换
adc_convert(ADC_0, ADC0_CH0_A0, ADC_12BIT)``
uint16 adc_convert(VADCN_enum vadc_n, VADC_CHN_enum vadc_chn, VADC_RES_enum vadc_res)
{
Ifx_VADC_RES result;
uint8 temp;
do
{
result = IfxVadc_getResult(&MODULE_VADC.G[vadc_n], vadc_chn%16);
} while (!result.B.VF);
temp = 4 - (vadc_res * 2);
return((result.U&0x0fff)>>temp);
}
3.adc_mean_filter函数
adc均值滤波
adc_mean_filter(ADC_0, ADC0_CH0_A0, ADC_12BIT, 5);//采集5次 然后返回平均值
uint16 adc_mean_filter(VADCN_enum vadc_n, VADC_CHN_enum vadc_chn, VADC_RES_enum vadc_res, uint8 count)
{
uint8 i;
uint32 sum;
ZF_ASSERT(count);//断言次数不能为0
sum = 0;
for(i=0; i<count; i++)
{
sum += adc_convert(vadc_n, vadc_chn, vadc_res);
}
sum = sum/count;
return (uint16)sum;
}
vadc_n:表示三个adc口ADC0,ADC1,ADC2
vadc_chn:表示每个adc口有的通道
主函数:
uint16 adc_result;
int core0_main(void)
{
disableInterrupts();
get_clk();//获取时钟频率 务必保留
//用户在此处调用各种初始化函数等
adc_init(ADC_0, ADC0_CH0_A0);//初始化ADC0 通道0 使用A0引脚
enableInterrupts();
while (TRUE)
{
//通过将A0引脚接到GND或者核心板VCC 查看FSS窗口中打印出来的ADC结果
//A0接到GND时 结果应该在0附近
//A0接到VCC时 结果应该在4095附近
//悬空时 结果可能是任意数,没有任何意义,所以大家不要问悬空的时候为什么结果是这么多呢?
adc_result = adc_mean_filter(ADC_0, ADC0_CH0_A0, ADC_12BIT, 10);//采集10次求平均 分辨率12位
//将结果通过串口打印,可以先学习printf例程,了解如何使用printf
printf("adc_result: %d\n", adc_result);
systick_delay_ms(STM0, 100);
}
}
所得结果就是从A某一个口中得到模拟信号并输出