前言
使用定时器来触发adc从而达到以固定的频率进行采样。
一、cubemx配置
ADC配置
f4和f1芯片配置和代码其实有一些细微的差别
F4芯片
首先勾选通道,然后先打开dma。
然后进行基础配置如下
TIM配置
二、代码编写
1.定义数组和标志位
uint32_t adc_buff[200];//存放ADC采集的数据
/*
AdcConvEnd用来检测ADC是否采集完毕
0:没有采集完毕
1:采集完毕,在stm32f1xx_it里的DMA完成中断进行修改
*/
__IO uint8_t AdcConvEnd = 0;
特别注意__IO修饰AdcConvEnd。他的含义是volatile。避免AdcConvEnd被MDK优化掉。
2.主函数
初始化
HAL_TIM_Base_Start(&htim2); //开启定时器3
HAL_ADC_Start_DMA(&hadc1, adc_buff, 200); //让ADC1去采集200个数,存放到adc_buff数组里
主循环中
if(AdcConvEnd==1)
{
for (uint16_t i = 0; i < 200; i++)
{
printf("%.3f\n", adc_buff[i] * 3.3 / 4095); //数据打印,查看结果
}
HAL_ADC_Start_DMA(&hadc1, adc_buff, 200); //让ADC1去采集200个数,存放到adc_buff数组里
AdcConvEnd=0;
}
3.中断
/*不要在void DMA2_Stream0_IRQHandler(void)中写,
不然的话会导致半传输完成中断发生,导致数组中的数据只有一半*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc==&hadc1)
{
AdcConvEnd=1;
HAL_ADC_Stop_DMA(&hadc1);
}
}
三、定时器采样率上限计算
adc的时钟为12MHZ
采样时间为3
那么采样率上限:
12M/13.5
四、采样频率
这个频率就与定时器的设置有关;
84M/840=10kHZ
五、相关回调函数
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
:当 ADC 完成一次转换时,会调用这个回调函数。
HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
:当 ADC 完成半个转换缓冲区的转换时,会调用这个回调函数。注意这个回调函数只在 DMA 转换模式下有效,且需要启用 DMA 半传输完成中断。
HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc)
:当 ADC 遇到错误时,会调用这个回调函数。
HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
:当 ADC 的转换结果超出窗口阈值时,会调用这个回调函数。
HAL_ADC_EndOfConversionCallback(ADC_HandleTypeDef* hadc)
:当 ADC 完成所有的转换序列时,会调用这个回调函数。
HAL_ADC_InjConvCpltCallback(ADC_HandleTypeDef* hadc)
:当注入组转换完成时,会调用这个回调函数。
总结
待写。。。。。。