STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

时间:2023-12-19 08:21:14

ADC工作均为非阻塞状态

轮询模式

中断模式

DMA模式


库函数:

 HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启

 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);

 HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询

 HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);//

 HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式

 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);

 void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断

 HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式

 HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);

 uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); //读取ADC的值

 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//结束后回调

 void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);//转换过程中回调

 void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);

 void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);

校准模式:

校准ADC(HAL_ADCEx_Calibration_Start(&hadc);有些芯片不支持校准,F4不支持

----------------------------------------------------------------------------------------------------------------------------------

可变占空比设置

 /*

 实际使用时空置引脚状态下会飘动,大致为3.3V的一半,是芯片内部的原因

 解决方式:引脚设置为下拉输入,F4没有这个设置

 */

 /* USER CODE BEGIN 2 */

 //  HAL_ADC_Start_IT(&hadc1);//开启ad转换

     HAL_TIM_Base_Start_IT(&htim3);//定时器中断

   HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启输出pwm

   /* USER CODE END 2 */

   /* Infinite loop */

   /* USER CODE BEGIN WHILE */

   while ()

   {

   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */

         float pwmOut ;

         float dutyRatio;

         int lastTickMs=;

         HAL_ADC_Start(&hadc1);

         if(HAL_GetTick() - lastTickMs >= )

     {

         HAL_GPIO_TogglePin(RUNNING_LED_GPIO_Port,RUNNING_LED_Pin);

         lastTickMs = HAL_GetTick();      

     }

     HAL_Delay();

         adcConvertedValue=HAL_ADC_GetValue(&hadc1);//获取AD转换值

     adcConvertedVoltage =(double)adcConvertedValue*3.3/;        

         pwmOut = adcConvertedValue*/;

         dutyRatio = pwmOut/ ;

         TIM3->CCR2 = pwmOut;    //(pwmOut)/ 2400    change Duty ratio

         printf("AD转换原始值 = %d\r\n", adcConvertedValue);

         printf("计算得出电压值 = %f V \r\n",adcConvertedVoltage);

         printf("实际输出pwm值 = %f\r\n", pwmOut);

         printf("占空比 = %f%%\r\n",dutyRatio*);

   }

   /* USER CODE END 3 */

 }

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

手动更改占空比

TIM3->CCR2   改变占空比

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

TIM3->ARR 改变频率

TIM3->PSC

ADC_EXIT  触发引脚

32芯片自带的温度传感器,在16或者18通道

可以用来做对比

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

代码:

 //对于12位的ADC,3.3V的ADC值为0xfff,温度为25度时对应的电压值为1.43V即0x6EE
#define V25 0x6EE
//斜率 每摄氏度4.3mV 对应每摄氏度0x05
#define AVG_SLOPE 0x05 /* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start_DMA(&hadcx,(uint32_t *)&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); /* 无限循环 */
while ()
{
HAL_Delay();
Current_Temperature = (V25-ADC_ConvertedValue)/AVG_SLOPE+; //计算公式
/* 10进制显示 */
printf("The IC current temperature = %d->%3d ℃\n",ADC_ConvertedValue,Current_Temperature);
// /* 16进制显示 */
// printf("The current temperature= %04x \n", Current_Temperature);
}

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

应用:测量压敏电阻阻值---还是测电压

   while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal =(float)ADC_ConvertedValue*3.3/;
flexiforce_R = 3.3*/ADC_ConvertedValueLocal; // V(out) = Rref * Vcc / R; Rref=20K Vcc=3.3V
printf("AD转换原始值 = 0x%04X \r\n", ADC_ConvertedValue);
printf("计算得出电压值 = %f V \r\n",ADC_ConvertedValueLocal);
printf("计算得出电阻值 = %f KR\n",flexiforce_R);
}

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

DMA多通道采集-----开启多通道设置,定义一个数组存放转换值

   while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[0]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[1]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[2]只取最低12有效数据
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue[]&0xFFF)*3.3/; // ADC_ConvertedValue[3]只取最低12有效数据 printf("CH1_PC0 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH2_PC1 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH3_PC2 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]);
printf("CH4_PC3 value = %d -> %fV\n",ADC_ConvertedValue[]&0xFFF,ADC_ConvertedValueLocal[]); printf("已经完成AD转换次数:%d\n",DMA_Transfer_Complete_Count);
DMA_Transfer_Complete_Count=;
printf("\n");
}

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

交叉模式---目的是两路ADC采集一路信号,可以获取双倍速度

 /* 启动AD转换并使能DMA传输和中断 */
HAL_ADC_Start(&hadcx2);
HAL_ADCEx_MultiModeStart_DMA(&hadcx1,&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); //开启 /* 无限循环 */
while ()
{
HAL_Delay();
/* 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,
即当输入为3.3V时,AD转换结果为4096 */
ADC_ConvertedValueLocal[] =(float)(ADC_ConvertedValue&0xFFF)*3.3/; //ADC1
ADC_ConvertedValueLocal[] =(float)((ADC_ConvertedValue>>)&0xFFF)*3.3/; //ADC2 printf("ADC1转换原始值 = 0x%04X --> 电压值 = %f V \n", ADC_ConvertedValue&0xFFFF,ADC_ConvertedValueLocal[]);
printf("ADC2转换原始值 = 0x%04X --> 电压值 = %f V \n", (ADC_ConvertedValue>>)&0xFFFF,ADC_ConvertedValueLocal[]);
printf("已经完成AD转换次数:%d\n",DMA_Transfer_Complete_Count);
printf("\r\n");
DMA_Transfer_Complete_Count=;
}

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

DAC---数据转换

基本配置:

初始化

设置通道

启动DAC

在循环中改变dac_value值即可

库函数:

 /* IO operation functions *****************************************************/
HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启
HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel);
HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel); /* 初始化DAC */
MX_DAC_Init();
/* 设置DAC通道值 */
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
/* 启动DAC */
HAL_DAC_Start(&hdac, DACx_CHANNEL); /* 无限循环 */
while ()
{
/* KEY1增加输出电压 */
if(KEY1_StateRead()==KEY_DOWN)
{
if(dac_value<)
dac_value+=;
else
dac_value=;
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value); //设置值
}
/* KEY2减少输出电压 */
if(KEY2_StateRead()==KEY_DOWN)
{
if(dac_value>)
dac_value-=;
else
dac_value=;
HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
}
}
STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

输出正弦波----DMA模式

就是预设一组值,不断改变

 const uint16_t CH_value[] = {
,,,,,,,,,,
,,,,,,,,,,,
,,,,,,,,,,
}; int main(void)
{
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config(); /* 初始化DAC */
MX_DAC_Init();
/* 启动定时器 */
HAL_TIM_Base_Start(&htim6);
/* 启动DAC DMA功能 */
HAL_DAC_Start_DMA(&hdac,DACx_CHANNEL,(uint32_t *)CH_value,,DAC_ALIGN_12B_R);
/* 无限循环 */
while ()
{ }
}

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置

2019-03-26