STM32F103ZET 包含有 3 个 ADC,分别为ADC1,ADC2,ADC3。
![](https://file.elecfans.com/web2/M00/0D/8A/poYBAGEDHcOAIMt9AAHXf3OXxoY850.png)
ADC通道引脚对应关系 |
![](https://file.elecfans.com/web2/M00/0D/8A/poYBAGEDHceAbhm4AATjqMMvWJE912.png)
查询和中断方式 |
STM32CUBEMX配置:
省略配置时钟和仿真口,直接设置IO,配置如下图。
代码编写(阻塞式进行ADC转换):
1.因为需要将PB0采集到的电压值通过串口打印到串口调试助手,所以需要用到sprintf,所以需要增加一个头文件#include "stdio.h"
2.宏定义led灯亮灭状态+变量
#include "stdio.h"
#define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮
#define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭
uint16_t adc_value=0,adc_volt=0;
uint8_t str_buff[64];
3.定义串口发送函数+ADC采样函数
void URE_Send_Info()
{
sprintf((char*)str_buff,"采样值:%d,电压值:%d.%d%dVrn",adc_value,adc_volt/100,(adc_volt%100)/10,adc_volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void adc_get_value()
{
HAL_ADC_Start(&hadc1); //启动ADC单次转换
LED0_ON();
if(HAL_ADC_PollForConversion(&hadc1,10)==HAL_OK)
{
adc_value=HAL_ADC_GetValue(&hadc1);
adc_volt=adc_value*330/4096;
}
URE_Send_Info();
LED0_OFF();
HAL_ADC_Stop(&hadc1);
}
4.主函数中的while(1)中加入ad采集函数
while (1)
{
/* USER CODE BEGIN 3 */
adc_get_value();
HAL_Delay(500);
}
/* USER CODE END 3 */
代码编写(中断式进行ADC转换):
1.第一步是一样的,都需要用到sprintf,所以需要增加一个头文件#include "stdio.h"
2.第二步也是一样,需要用到led灯和一些变量
#include "stdio.h"
#define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮
#define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭
uint16_t adc_value=0,adc_volt=0;
uint8_t str_buff[64];
3.定义串口发送函数+ADC采样函数。目的一样,但是函数不一样了
void URE_Send_Info()
{
sprintf((char*)str_buff,"采样值:%d,电压值:%d.%d%dVrn",adc_value,adc_volt/100,(adc_volt%100)/10,adc_volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
adc_value=HAL_ADC_GetValue(&hadc1);
adc_volt=adc_value*330/4096;
URE_Send_Info();
LED0_OFF();
}
}
4.主函数中的while(1)中开启ADC
while (1)
{
/* USER CODE BEGIN 3 */
LED0_ON();
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(500);
}
/* USER CODE END 3 */
STM32F103ZET 包含有 3 个 ADC,分别为ADC1,ADC2,ADC3。
![](https://file.elecfans.com/web2/M00/0D/8A/poYBAGEDHcOAIMt9AAHXf3OXxoY850.png)
ADC通道引脚对应关系 |
![](https://file.elecfans.com/web2/M00/0D/8A/poYBAGEDHceAbhm4AATjqMMvWJE912.png)
查询和中断方式 |
STM32CUBEMX配置:
省略配置时钟和仿真口,直接设置IO,配置如下图。
代码编写(阻塞式进行ADC转换):
1.因为需要将PB0采集到的电压值通过串口打印到串口调试助手,所以需要用到sprintf,所以需要增加一个头文件#include "stdio.h"
2.宏定义led灯亮灭状态+变量
#include "stdio.h"
#define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮
#define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭
uint16_t adc_value=0,adc_volt=0;
uint8_t str_buff[64];
3.定义串口发送函数+ADC采样函数
void URE_Send_Info()
{
sprintf((char*)str_buff,"采样值:%d,电压值:%d.%d%dVrn",adc_value,adc_volt/100,(adc_volt%100)/10,adc_volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void adc_get_value()
{
HAL_ADC_Start(&hadc1); //启动ADC单次转换
LED0_ON();
if(HAL_ADC_PollForConversion(&hadc1,10)==HAL_OK)
{
adc_value=HAL_ADC_GetValue(&hadc1);
adc_volt=adc_value*330/4096;
}
URE_Send_Info();
LED0_OFF();
HAL_ADC_Stop(&hadc1);
}
4.主函数中的while(1)中加入ad采集函数
while (1)
{
/* USER CODE BEGIN 3 */
adc_get_value();
HAL_Delay(500);
}
/* USER CODE END 3 */
代码编写(中断式进行ADC转换):
1.第一步是一样的,都需要用到sprintf,所以需要增加一个头文件#include "stdio.h"
2.第二步也是一样,需要用到led灯和一些变量
#include "stdio.h"
#define LED0_ON() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET)//LED0点亮
#define LED0_OFF() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET)//LED0熄灭
uint16_t adc_value=0,adc_volt=0;
uint8_t str_buff[64];
3.定义串口发送函数+ADC采样函数。目的一样,但是函数不一样了
void URE_Send_Info()
{
sprintf((char*)str_buff,"采样值:%d,电压值:%d.%d%dVrn",adc_value,adc_volt/100,(adc_volt%100)/10,adc_volt%10);
HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
adc_value=HAL_ADC_GetValue(&hadc1);
adc_volt=adc_value*330/4096;
URE_Send_Info();
LED0_OFF();
}
}
4.主函数中的while(1)中开启ADC
while (1)
{
/* USER CODE BEGIN 3 */
LED0_ON();
HAL_ADC_Start_IT(&hadc1);
HAL_Delay(500);
}
/* USER CODE END 3 */
举报