AC7801的ADC太厉害了,12bit精度,1M采样率,支持DMA,多种采样模式……
然而7801内的例程使用了DMA, 对于刚入门的同学们就不是很好理解,简单的应用也不需要用到DMA。因此,实现了一个一次只采样1个通道,轮询采样结果,非常简单的一个小demo。
/**
* ADC0_init
*
* @param[in] void
* [url=home.php?mod=space&uid=266161]@return[/url] void
*
* [url=home.php?mod=space&uid=247401]@brief[/url] ADC初始化
*
*/
void ADC0_init(void)
{
ADC_ConfigType adcConfig = {0};
GPIO_SetFunc(GPIOA, GPIO_PIN7, GPIO_FUN2); ///<ADC_IN4 Analog function enable, PA7
GPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN2); ///<ADC_IN3 Analog function enable, PA8
GPIO_SetFunc(GPIOA, GPIO_PIN2, GPIO_FUN2); ///<ADC_IN8 Analog function enable, PA2
adcConfig.regularSequenceLength = 1;
adcConfig.powerMode = ADC_POWER_ON;
ADC_Init(ADC0, &adcConfig);
}
ADC的初始化,调用了驱动库中的ADC_Init(),adcConfig中多数变量采用默认值0,只是将规则组长度设置为1,并开启ADC电源。配置了采样引脚。采用其他引脚采样,需要自行更改引脚。
/**
* ADC_Convert
*
* @param[in] adcChl ADC通道,参考ADC_ChannelType
* @return ad转换结果
*
* @brief 获取AD转换结果
*
*/
uint16_t ADC_Convert(ADC_ChannelType adcChl)
{
uint16_t adcRst = 0;
ADC_SetRegularGroupChannel(ADC0, adcChl, ADC_SPT_CLK_215, 0); //采样&转换时间= (7+12)/24000000 + 5/24000000 = 1us
ADC_SoftwareStartRegularConvert(ADC0); ///软件触发规则组采样
while (0 == ADC_GetEOCFlag(ADC0)){
}
adcRst = ADC_GetRegularData(ADC0);
return adcRst;
}
通过ADC_Convert() 函数,传入要转换的AD通道号, AD采样结束后返回AD转换结果。
/**
* main
*
* @param[in] void
* @return 0
*
* @brief 主函数入口
*
*/
int main(void)
{
InitDelay();
InitDebug();
ADC0_init();
printf("ADC convert sample.\r\n");
while (1) {
mdelay(500);
printf("ADC convert result:%d\r\n", ADC_Convert(ADC_CH_8));
}
}
测试代码将7801开发板上电位器电压采集下来并通过串口输出。
测试结果如下:
贡献测试代码给有需要的小伙伴
|