首页 » 智能 » STM32 HAL库进修系列第1篇 ADC设备 及 DAC设备_年夜众_"

STM32 HAL库进修系列第1篇 ADC设备 及 DAC设备_年夜众_"

神尊大人 2024-12-01 18:25:25 0

扫一扫用手机浏览

文章目录 [+]

中断模式

DMA模式

STM32 HAL库进修系列第1篇 ADC设备 及 DAC设备_年夜众_" 智能

库函数:

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 (1) { / USER CODE END WHILE / / USER CODE BEGIN 3 / float pwmOut ; float dutyRatio; int lastTickMs=0; HAL_ADC_Start(&hadc1); if(HAL_GetTick() - lastTickMs >= 1000) { HAL_GPIO_TogglePin(RUNNING_LED_GPIO_Port,RUNNING_LED_Pin); lastTickMs = HAL_GetTick(); } HAL_Delay(1000); adcConvertedValue=HAL_ADC_GetValue(&hadc1);//获取AD转换值 adcConvertedVoltage =(double)adcConvertedValue3.3/4096; pwmOut = adcConvertedValue2400/4096; dutyRatio = pwmOut/2400 ; 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\公众,dutyRatio100); } / USER CODE END 3 /}

手动变动占空比

TIM3->ARR 改变频率

TIM3->PSC

ADC_EXIT 触发引脚

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

可以用来做比拟

//对付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 (1) { HAL_Delay(1000); Current_Temperature = (V25-ADC_ConvertedValue)/AVG_SLOPE+25; //打算公式 / 10进制显示 / printf(\"大众The IC current temperature = %d->%3d ℃\n\"大众,ADC_ConvertedValue,Current_Temperature);// / 16进制显示 / // printf(\公众The current temperature= %04x \n\公众, Current_Temperature); }

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

while (1)

{

HAL_Delay(1000);

/ 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096,

即当输入为3.3V时,AD转换结果为4096 /

ADC_ConvertedValueLocal =(float)ADC_ConvertedValue3.3/4096;

flexiforce_R = 3.320/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);

}

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

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

交叉模式---目的是两路ADC采集一起旗子暗记,可以获取双倍速率

/ 启动AD转换并使能DMA传输和中断 / HAL_ADC_Start(&hadcx2); HAL_ADCEx_MultiModeStart_DMA(&hadcx1,&ADC_ConvertedValue,sizeof(ADC_ConvertedValue)); //开启 / 无限循环 / while (1) { HAL_Delay(1000); / 3.3为AD转换的参考电压值,stm32的AD转换为12bit,2^12=4096, 即当输入为3.3V时,AD转换结果为4096 / ADC_ConvertedValueLocal[0] =(float)(ADC_ConvertedValue&0xFFF)3.3/4096; //ADC1 ADC_ConvertedValueLocal[1] =(float)((ADC_ConvertedValue>>16)&0xFFF)3.3/4096; //ADC2 printf(\"大众ADC1转换原始值 = 0x%04X --> 电压值 = %f V \n\公众, ADC_ConvertedValue&0xFFFF,ADC_ConvertedValueLocal[0]); printf(\"大众ADC2转换原始值 = 0x%04X --> 电压值 = %f V \n\公众, (ADC_ConvertedValue>>16)&0xFFFF,ADC_ConvertedValueLocal[1]); printf(\"大众已经完成AD转换次数:%d\n\"大众,DMA_Transfer_Complete_Count); printf(\公众\r\n\公众); DMA_Transfer_Complete_Count=0; }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 (1) { / KEY1增加输出电压 / if(KEY1_StateRead()==KEY_DOWN) { if(dac_value<245) dac_value+=10; else dac_value=255; HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value); //设置值 } / KEY2减少输出电压 / if(KEY2_StateRead()==KEY_DOWN) { if(dac_value>10) dac_value-=10; else dac_value=0; HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value); } }

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

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

const uint16_t CH_value[32] = { 2448,2832,3186,3496,3751,3940,4057,4095,4057,3940, 3751,3496,3186,2832,2448,2048,1648,1264,910,600,345, 156,39,0,39,156,345,600,910,1264,1648,2048}; 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,32,DAC_ALIGN_12B_R); / 无限循环 / while (1) { }}

相关文章

MOBYit,引领未来智能物流的先驱

随着互联网、大数据、人工智能等技术的飞速发展,物流行业正经历着前所未有的变革。在这个变革的时代,MOBYit应运而生,以智能化、高...

智能 2024-12-30 阅读0 评论0

Noheit,新时代企业管理智慧

在当今这个瞬息万变的时代,企业管理面临着前所未有的挑战。如何提高企业竞争力,实现可持续发展,成为了摆在企业家面前的一道难题。在这种...

智能 2024-12-30 阅读0 评论0

Oniton,探索科技与生活的无缝衔接

在信息化、数字化时代,科技的快速发展正深刻改变着我们的生活方式。人们越来越追求便捷、高效的生活体验,而这一切都离不开科技的助力。在...

智能 2024-12-30 阅读0 评论0

Poveit,探索未来科技,引领智能时代

随着科技的飞速发展,人工智能已经成为我国科技创新的重要方向。在众多人工智能技术中,Poveit技术凭借其独特的优势,正逐渐成为行业...

智能 2024-12-30 阅读0 评论0