一、准备工作
有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置
二、所用工具
1、芯片: STM32F407ZGT6
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F4xxHAL库
三、实现功能
ADC采集波形并通过上位机显示(单通道+多通道)
四、单通道ADC
1、HAL库开启ADC通道1
配置为软件触发模式
至此,CUBEMX配置完成
2、main.c
为方便阅读,下附代码仅保留了关键部分代码,删去了冗长的注释,请读者自行将代码填写在对应位置。
#define SAMP 1
uint16_t adc1[SAMP]={0};
int main(void)
{
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,SAMP);
HAL_Delay(300);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //DMA采集完成中断服务函数
{
HAL_ADC_Stop_DMA(&hadc1);//关闭DMA的ADC采集
printf("%d\r\n",adc1[0]);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,SAMP);
}
/* USER CODE END 4 */
五、多通道ADC
1、HAL库开启ADC通道1、2、3
Scan Conversion Mode:开启扫描转换模式
Number Of Conversion:设置转换通道为3个
Rank:传入顺序
配置每个Rank的通道号
2、main.c
#define SAMP 3
uint16_t adc1[SAMP]={0};
int main(void)
{
/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,SAMP);
HAL_Delay(300);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) //DMA采集完成中断服务函数
{
HAL_ADC_Stop_DMA(&hadc1);//关闭DMA的ADC采集
printf("%d,%d,%d\r\n",adc1[0],adc1[1],adc1[2]);
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)adc1,SAMP);
}
/* USER CODE END 4 */
六、VOFA+上位机配置
至此,只要在主函数中写printf("%d,%d\n",xx1,xx2);即可输出数据
七、巨人之肩
【STM32】HAL库 STM32CubeMX教程九---ADC
八、源码提供
资源【STM32+HAL】ADC采集波形实现(单通道+多通道)
九、拓展
因STM32自带ADC仅能采样0-3.3V的电压,无法采集更高的电压值。若要采集更高的电压值,可采取分压电路。
十、结语
本人能力有限,代码未必是最优解,若有可改进之处望在评论区留言,采纳有赏~