• HC32_HC32F072FAUA_ADC内部温度传感器


    1 首先你得有一个工程

    参考前面介绍的:

    HC32_HC32F072FAUA_从零开始搭建空工程模板_江湖上都叫我秋博的博客-CSDN博客

    HC32_keil工程的复制_重命名_以及函数、变量定义的正常跳转问题_江湖上都叫我秋博的博客-CSDN博客

    复制一个新工程,重命名为ADC, 开启美妙的ADC通信之旅

    2 看参考样例

    路径:官网提供的驱动库及样例的压缩包解压后

    xxx\hc32f072_ddl_Rev1.1.1\example\adc\adc_sgl_always_sw\MDK\ adc_sgl_always_sw.uvprojx

    3 我们自己的代码

    我们样例代码稍加修改,移植到我们的框架当中。

    本代码同时拥有 LED闪烁、UART通信、DAC指定输出以及ADC内部温度传感器测量环境温度的功能。

    下面先给出参考手册上面 Page:917- 918需要关注的部分。

    代码中主要关注 // ▲ 

     main.c

    1. #include "ddl.h"
    2. #include "uart.h"
    3. #include "gpio.h"
    4. #include "dac.h"
    5. #include "user_gpio.h"
    6. #include "user_uart.h"
    7. #include "user_dac.h"
    8. #include "user_adc.h"
    9. int32_t main(void)
    10. {
    11. // sys_clk_init(); // 系统的时钟初始化 应该放在串口初始化之前 否则系统会出问题
    12. user_led_init();
    13. user_uart_init();
    14. user_dac_init();
    15. user_adc_init();
    16. while(1)
    17. {
    18. if(fpgaRxFlag == 1){ // 当我收到fpga发来的固定长度为8的8个字节以后,我把它发过来的数据,给它回传回去
    19. send_data_to_fpga(fpgaRx, 8);
    20. fpgaRxFlag = 0;
    21. }
    22. if(pcRxFlag ==1 ){
    23. send_data_to_pc(pcRx, 8);
    24. pcRxFlag = 0;
    25. }
    26. get_temperature(); // ▲ 本文相关
    27. DAC_OUT = 2048;
    28. Dac0_SoftwareTriggerCmd();
    29. Gpio_SetIO(LED1_PORT, LED1_PIN);
    30. Gpio_SetIO(LED2_PORT, LED2_PIN);
    31. delay1ms(500); // while 里面必须有个延迟,不然while(1)把cpu占用了,进不了中断。
    32. Gpio_ClrIO(LED1_PORT, LED1_PIN);
    33. Gpio_ClrIO(LED2_PORT, LED2_PIN);
    34. delay1ms(500);
    35. }
    36. }

    user_adc.c

    1. #include "user_adc.h"
    2. #include "gpio.h"
    3. #include "bgr.h"
    4. #include "adc.h"
    5. uint16_t Trim = 0;
    6. uint32_t u32AdcRestult;
    7. float temperature = 0;
    8. // ADC端口 配置
    9. void adc_gpio_config(void)
    10. {
    11. Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // 开启ADC/BGR GPIO外设时钟
    12. Gpio_SetAnalogMode(GpioPortA, GpioPin0); // PA00 (AIN0)
    13. }
    14. // ADC模块 初始化
    15. void adc_config(void)
    16. {
    17. stc_adc_cfg_t stcAdcCfg;
    18. DDL_ZERO_STRUCT(stcAdcCfg);
    19. // 开启ADC/BGR外设时钟
    20. Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);
    21. Bgr_BgrEnable(); // 开启BGR
    22. Bgr_TempSensorEnable(); // ▲【开启温度传感器】
    23. // ADC 初始化配置
    24. stcAdcCfg.enAdcMode = AdcSglMode; // 采样模式-单次
    25. stcAdcCfg.enAdcClkDiv = AdcMskClkDiv1; // 采样分频-1
    26. stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; // 采样周期数-12
    27. stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5; // 参考电压选择-内部2.5V
    28. stcAdcCfg.enAdcOpBuf = AdcMskBufEnable; // ▲ OP BUF配置-开
    29. stcAdcCfg.enInRef = AdcMskInRefEnable; // 内部参考电压使能-开
    30. stcAdcCfg.enAdcAlign = AdcAlignRight; // 转换结果对齐方式-右
    31. Adc_Init(&stcAdcCfg);
    32. }
    33. // ADC 单次采样模式 配置
    34. void adc_sgl_config(void)
    35. {
    36. // 配置单次采样通道
    37. Adc_CfgSglChannel(AdcAiTsInput);
    38. // 启动单次一直采样
    39. Adc_SGL_Always_Start();
    40. }
    41. void user_adc_init(void){
    42. adc_gpio_config();
    43. adc_config();
    44. adc_sgl_config();
    45. }
    46. void get_temperature(void){
    47. if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl))
    48. {
    49. // 获取采样值
    50. Trim = *((uint16_t *)(0x00100C36)); // ▲ 2.5V对应的地址
    51. u32AdcRestult = Adc_GetSglResult();
    52. temperature = 25 + 0.2135 * (float)(u32AdcRestult - Trim );
    53. // ▲ 0.2135 = 0.0854 ×2.5
    54. Adc_ClrIrqStatus(AdcMskIrqSgl);
    55. }
    56. }

    user_dac.h

    1. #ifndef _USER_ADC_H_
    2. #define _USER_ADC_H_
    3. #include "ddl.h"
    4. extern float temperature;
    5. extern uint16_t Trim;
    6. extern uint32_t u32AdcRestult;
    7. void adc_gpio_config(void);
    8. void adc_config(void);
    9. void adc_sgl_config(void);
    10. void user_adc_init(void);
    11. void get_temperature(void);
    12. #endif

    读出的环境温度被保存到了全局变量 temperature 中,在线断点调试可以添加到watch中查看。

     

    感谢您的阅读,欢迎留言讨论、收藏、点赞。

  • 相关阅读:
    react hook
    MySql运维篇---008:日志:错误日志、二进制日志、查询日志、慢查询日志,主从复制:概述 虚拟机更改ip注意事项、原理、搭建步骤
    哈希原理和解决哈希冲突方法
    某光伏行业头部企业联合谢宁老师《向华为学习 业务领先的战略规划SP(BLM)和战略解码BP(BEM)》训战内训成功举办
    设计模式-结构型模式-桥接模式
    【Java8新特性】- 接口中默认方法修饰为普通方法
    C#调用C++生成的DLL 找不到入口点 以及 尝试读取或写入受保护的内存
    统计学入门:时间序列分析基础知识详解
    如何使用cmd运行java程序
    playwright自动化项目搭建
  • 原文地址:https://blog.csdn.net/heqiunong/article/details/125993441