ADC工作均为非阻塞状态

轮询模式

中断模式

DMA模式


库函数:

  1. HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启
  2.  
  3. HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
  4.  
  5. HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);//等待转换结束,只适用于轮询
  6.  
  7. HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);//
  8.  
  9. HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式
  10.  
  11. HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
  12.  
  13. void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断
  14.  
  15. HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式
  16.  
  17. HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
  18.  
  19. uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); //读取ADC的值
  20.  
  21. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);//结束后回调
  22.  
  23. void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);//转换过程中回调
  24.  
  25. void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);
  26.  
  27. void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
 

校准模式:

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

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

可变占空比设置

  1. /*
  2.  
  3. 实际使用时空置引脚状态下会飘动,大致为3.3V的一半,是芯片内部的原因
  4.  
  5. 解决方式:引脚设置为下拉输入,F4没有这个设置
  6.  
  7. */
  8.  
  9. /* USER CODE BEGIN 2 */
  10.  
  11. // HAL_ADC_Start_IT(&hadc1);//开启ad转换
  12.  
  13. HAL_TIM_Base_Start_IT(&htim3);//定时器中断
  14.  
  15. HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//开启输出pwm
  16.  
  17. /* USER CODE END 2 */
  18.  
  19. /* Infinite loop */
  20.  
  21. /* USER CODE BEGIN WHILE */
  22.  
  23. while ()
  24.  
  25. {
  26.  
  27. /* USER CODE END WHILE */
  28.  
  29. /* USER CODE BEGIN 3 */
  30.  
  31. float pwmOut ;
  32.  
  33. float dutyRatio;
  34.  
  35. int lastTickMs=;
  36.  
  37. HAL_ADC_Start(&hadc1);
  38.  
  39. if(HAL_GetTick() - lastTickMs >= )
  40.  
  41. {
  42.  
  43. HAL_GPIO_TogglePin(RUNNING_LED_GPIO_Port,RUNNING_LED_Pin);
  44.  
  45. lastTickMs = HAL_GetTick();
  46.  
  47. }
  48.  
  49. HAL_Delay();
  50.  
  51. adcConvertedValue=HAL_ADC_GetValue(&hadc1);//获取AD转换值
  52.  
  53. adcConvertedVoltage =(double)adcConvertedValue*3.3/;
  54.  
  55. pwmOut = adcConvertedValue*/;
  56.  
  57. dutyRatio = pwmOut/ ;
  58.  
  59. TIM3->CCR2 = pwmOut; //(pwmOut)/ 2400 change Duty ratio
  60.  
  61. printf("AD转换原始值 = %d\r\n", adcConvertedValue);
  62.  
  63. printf("计算得出电压值 = %f V \r\n",adcConvertedVoltage);
  64.  
  65. printf("实际输出pwm值 = %f\r\n", pwmOut);
  66.  
  67. printf("占空比 = %f%%\r\n",dutyRatio*);
  68.  
  69. }
  70.  
  71. /* USER CODE END 3 */
  72.  
  73. }

手动更改占空比

TIM3->CCR2   改变占空比

TIM3->ARR 改变频率

TIM3->PSC

ADC_EXIT  触发引脚

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

可以用来做对比

代码:

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

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

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

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

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

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

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

DAC---数据转换

基本配置:

初始化

设置通道

启动DAC

在循环中改变dac_value值即可

库函数:

  1. /* IO operation functions *****************************************************/
  2. HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef* hdac, uint32_t Channel);
  3. HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef* hdac, uint32_t Channel);
  4. HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t* pData, uint32_t Length, uint32_t Alignment); //需要函数中不断开启
  5. HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef* hdac, uint32_t Channel);
  6. HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef* hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
  7. uint32_t HAL_DAC_GetValue(DAC_HandleTypeDef* hdac, uint32_t Channel);
  8.  
  9. /* 初始化DAC */
  10. MX_DAC_Init();
  11. /* 设置DAC通道值 */
  12. HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
  13. /* 启动DAC */
  14. HAL_DAC_Start(&hdac, DACx_CHANNEL);
  15.  
  16. /* 无限循环 */
  17. while ()
  18. {
  19. /* KEY1增加输出电压 */
  20. if(KEY1_StateRead()==KEY_DOWN)
  21. {
  22. if(dac_value<)
  23. dac_value+=;
  24. else
  25. dac_value=;
  26. HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value); //设置值
  27. }
  28. /* KEY2减少输出电压 */
  29. if(KEY2_StateRead()==KEY_DOWN)
  30. {
  31. if(dac_value>)
  32. dac_value-=;
  33. else
  34. dac_value=;
  35. HAL_DAC_SetValue(&hdac, DACx_CHANNEL, DAC_ALIGN_8B_R, dac_value);
  36. }
  37. }

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

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

  1. const uint16_t CH_value[] = {
  2. ,,,,,,,,,,
  3. ,,,,,,,,,,,
  4. ,,,,,,,,,,
  5. };
  6.  
  7. int main(void)
  8. {
  9. /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  10. HAL_Init();
  11. /* 配置系统时钟 */
  12. SystemClock_Config();
  13.  
  14. /* 初始化DAC */
  15. MX_DAC_Init();
  16. /* 启动定时器 */
  17. HAL_TIM_Base_Start(&htim6);
  18. /* 启动DAC DMA功能 */
  19. HAL_DAC_Start_DMA(&hdac,DACx_CHANNEL,(uint32_t *)CH_value,,DAC_ALIGN_12B_R);
  20. /* 无限循环 */
  21. while ()
  22. {
  23.  
  24. }
  25. }

2019-03-26

STM32 HAL库学习系列第1篇 ADC配置 及 DAC配置的更多相关文章

  1. STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置

    cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error:  #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...

  2. STM32 HAL库学习系列第8篇---回调函数总结

    普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返 ...

  3. STM32 HAL库学习系列第6篇---定时器TIM 级联配置

    应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不 ...

  4. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  5. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  6. STM32 HAL库学习系列第2篇 GPIO配置

    GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void H ...

  7. STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

    测量脉冲宽度或者测量频率   基本方法 1.设置TIM2 CH1为输入捕获功能:  2.设置上升沿捕获:  3.使能TIM2 CH1捕获功能:  4.捕获到上升沿后,存入capture_buf[0], ...

  8. STM32 HAL库学习系列---定时器TIM 输入捕获功能

    基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后 ...

  9. 【书籍连载】《STM32 HAL 库开发实战指南—基于F7》-第一章

    从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章  如何使用本书 1.1  本书的参考资料 本书参考资料为:<STM32 ...

随机推荐

  1. Django 模板继承extend 标签include block

    # block 站网页位置# includ 导入网页标签# extends 导入网页模板 # common_js.html <script src="/static/plugins/j ...

  2. 一个Interface 继承多个Interface 的总结

    我们知道在Java中的继承都是单继承的,就是说一个父类可以被多个子类继承但是一个子类只能有一个父类.但是一个接口可以被不同实现类去实现,这就是我们说的Java中的多态的概念.下面我们再来说一下接口的多 ...

  3. Java 性能调优指南之 Java 集合概览

    [编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本 ...

  4. zabbix系列之六——安装后配置二Items

    https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/snmp 1Items 1.1creating items ...

  5. Windows ->> 解决Windows 10下面无法多用户同时远程桌面

    解决Windows 10下面无法多用户同时远程桌面 https://pc4u.org/how-to-allow-multiple-rdp-sessions-windows-10-without-mod ...

  6. C#关于微信昵称中存在的表情图标乱码解决

    //在获取微信用户信息时加密保存到数据库 System.Web.HttpUtility.UrlEncode("需要加密的字段") //前端在展示是解码 <script typ ...

  7. 安装matplotlib

    1.1 Linux中安装matplotlib 如果使用的系统自带的python版本,可使用系统的包管理器安装matplotlib,命令如下: $ sudo apt-get install python ...

  8. mysql内存评估计算

    这是一个可以评估mysql内存使用大小的网站,根据一些基本的参数,来确定的. 网站:http://www.mysqlcalculator.com/

  9. Linux 系统级别优化_【all】

    Linux 系统优化 1.Linux系统关闭SELinux 2.Linux系统开机到登录之前启动流程 3.Linux系统设置运行级别 4.Linux系统重要的开机自启动的服务 5.Linux查看系统当 ...

  10. Mysql不改默认侦听回环地址而ssh通道连接的办法

    Mysql不改默认侦听回环地址而ssh通道连接的办法 文:铁乐与猫 比较新版的mysql默认侦听的网卡地址是本地回环地址:127.0.0.1: 比如你在/etc/mysql/my.cnf配置文件中往往 ...