Background Information
STM32F40x和STM32F41x芯片内部自动集成了温度传感器,连接到ADC1通道16。
串口1集成了CH340G芯片,所以可以直接和PA9,PA10通讯,用别的串口的话要额外买CH340模块,CH340的接收端连接单片机发送端,发送端连接单片机接收端。
在adc.c中MX_ADC1_Init中加入HAL_ADC_Start_IT(&hadc1); 如果把它加在main函数里要放在MX_ADC1_Init();之后。
重写callback函数。
ADC多通道采集一般用DMA,因为DMA有一个缓冲区,把ADC转换采集到的数据放进缓冲区。
IN1作为光敏电阻通道,IN16位温度传感器。
在DMA中添加ADC1,因为我们转换16位,而单片机为32位,所以data width选择half word(十六位)。要注意到时设置变量要设置uint16_t变量。然后DMA Continuous Requests Enabled. Scan Conversion Mode 使能。Coninuous Conversion Mode Enabled. End Of Conversion Selection等所有通道转换完再结束。在ADC_Regular_ConversionMode中选择两个通道,然后排序。温度排序1采样周期480Cycles, Channel1排序2采样周期480Cycles.记得不要勾选中断。
DMA Settings模式选Circular.
定义全局变量uint16_t ADC_Value[2] = {0};(长度为2的数组因为只有两个通道)
直接在main函数中调用HAL_ADC_Start_DMA(&hadc1, ADC_Value, 2);
Result:
Code:
/* USER CODE BEGIN Includes */
uint16_t ADC_Value = 0;
double V_sense = 0;
double C = 0;
double F = 0;
/* USER CODE END Includes */
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t buff[1024] = {0};
/* USER CODE END 1 */
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
while (1)
{
/* USER CODE BEGIN 3 */
V_sense = ADC_Value/4096.0*3.3;
C = (V_sense - 0.76)/0.0025 + 25.0;
F = C * 1.8 + 32.0;
sprintf(buff, "V = %.3f V C = %.3f degree F = %.3f degree\r\n", V_sense, C, F);
HAL_UART_Transmit(&huart1, buff, strlen(buff), 5000);
HAL_Delay(500);
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc == &hadc1){
ADC_Value = HAL_ADC_GetValue(hadc);
}
}
/* USER CODE END 4 */