(四)【STM32】HAL库ADC多通道采样(1kHZ)
可见,一次定时器触发只记录一个数据,而传输两个数据需要两次定时器触发的时间,这也就是为什么时间变成了预期的2倍。修改TIM3的PSC为 35。提升波特率为230400。加入定时器中断,检查。
·
一.未用定时器(未实现1kHZ传输,4通道)
1.CubeMX配置





2.代码
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t values[4]={0};
float voltage;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
for(uint8_t i=0;i<4;i++)
{
HAL_ADC_Start(&hadc1); //开启ADC1
if(HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY)==HAL_OK)//如果转换完成
{
values[i]=HAL_ADC_GetValue(&hadc1);
voltage = values[i] * 3.3f / 4095.0f;
char buffer[50];
sprintf(buffer, "%d:%.3f V\r\n", i,voltage);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer),100);
}
HAL_Delay(100);
}
}
/* USER CODE END 3 */
3.实验结果

二.ADC+定时器(1kHZ发1拨数据,2通道,轮询)
1.CubeMX配置


2.修改代码
/* USER CODE BEGIN PV */
uint16_t values[2]={0};
float voltage;
/* USER CODE END PV */
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1) ;
HAL_TIM_Base_Start(&htim3);
/* USER CODE END 2 */
/* USER CODE BEGIN 3 */
for(uint8_t i=0;i<2;i++)
{
HAL_ADC_Start(&hadc1);
if(HAL_ADC_PollForConversion(&hadc1,HAL_MAX_DELAY)==HAL_OK)
{
values[i]=HAL_ADC_GetValue(&hadc1);
voltage = values[i] * 3.3f / 4095.0f;
char buffer[50];
sprintf(buffer, "%d:%.3f \r\n", i,voltage);
HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer),100);
}
}
}
/* USER CODE END 3 */
三.DMA+ADC+定时器(1KHZ发两拨数据,2通道)
1.CubeMX配置

2.代码
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t values[2] ;
char message[50]="";
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1);
HAL_TIM_Base_Start(&htim3);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)values, 2);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef*hadc){
if(hadc==&hadc1){
sprintf(message,"%.3f %.3f\r\n",values[0]* 3.3f / 4095.0f,values[1]* 3.3f / 4095.0f);
//HAL_UART_Transmit_DMA(&huart1,(uint8_t*)message,strlen(message));
}
}
/* USER CODE END 4 */
问题:数据的传输周期不是1ms而显示2ms.

加入定时器中断,检查
可见,一次定时器触发只记录一个数据,而传输两个数据需要两次定时器触发的时间,这也就是为什么时间变成了预期的2倍。

解决:
提升波特率为230400

修改TIM3的PSC为 35

结果

更多推荐



所有评论(0)