本帖最后由 yinxiangxv 于 2024-8-13 19:19 编辑
最初是打算外接一个旋钮开关进行模拟量的采集ADC即模拟数字转换,是将模拟电压量转换为数字量的一种手段,如下图所示为STM32F407单个ADC的结构框图 (注释1),其主要包括5个部分,分别为 ADC电源引脚、 ADC输入引脚、 ADC触发源、 ADC转换规则和 ADC中断触发等
ADC电源引脚有VDDA、VSSA、VREF+和VREF-四个引脚,STM32的ADC采集范围为VREF- ≤ VIN ≤ VREF+,一般将ADC的负端参考电压与VSSA短接然后接地,将ADC的正端参考电压接VDDA即3.3V,这样ADC的采集范围就设置为0~3.3V,对于12位分辨率的ADC,其采集数字量范围为0-4095,这样就可以将0-3.3V的电压映射到0-4095的数字量,使其可以相互转化,ADC电源即参考电压引脚具体描述如下图所示
ADC的转换主要依靠12位分辨率的片上模数转换器 注入通道和规则通道均有16个触发源,可以选择定时器外部源触发/定时器比较捕获触发/软件常规触发 ADC启动转换时需要按照一定通道顺序转化,该顺序由规则通道和注入通道两者共同决定,其中注入通道其数据寄存器为4*16位,因此可以同时转换四个通道 但是规则通道的数据寄存器只有一个16位的寄存器,因此必须一个通道一个通道的转换,每转换完一个通道,就需要及时将转换完成的结果从规则通道数据寄存器中读出去 手册中关于时间触发的描述:
本实验采用的是tim3的in15和adc1
相关回调函数要在adc.c中进行实现 void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_ADC_CLK_DISABLE();
/**ADC1 GPIO Configuration
PA3 ------> ADC1_INP15
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_3);
/* ADC1 interrupt Deinit */
HAL_NVIC_DisableIRQ(ADC1_IRQn);
/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/*转换完成中断回调*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
/*定时器中断启动单通道转换*/
if(hadc->Instance == ADC1)
{
uint32_t val=HAL_ADC_GetValue(&hadc1);
uint32_t Volt=(3300*val)>>12;
printf("val:%d, Volt:%d\r\n",val,Volt);
}
}
/* USER CODE END 1 */
printf的实现方法比较多,可以基于库函数进行实现 也可以参考之前发出来的xprintf这个串口通信实现方式
|