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
#include "ddl.h"
#include "uart.h"
#include "gpio.h"
#include "dac.h"#include "user_gpio.h"
#include "user_uart.h"
#include "user_dac.h"
#include "user_adc.h"int32_t main(void)
{ // sys_clk_init(); // 系统的时钟初始化 应该放在串口初始化之前 否则系统会出问题user_led_init();user_uart_init();user_dac_init();user_adc_init();while(1){if(fpgaRxFlag == 1){ // 当我收到fpga发来的固定长度为8的8个字节以后,我把它发过来的数据,给它回传回去send_data_to_fpga(fpgaRx, 8);fpgaRxFlag = 0; }if(pcRxFlag ==1 ){send_data_to_pc(pcRx, 8);pcRxFlag = 0; }get_temperature(); // ▲ 本文相关DAC_OUT = 2048; Dac0_SoftwareTriggerCmd();Gpio_SetIO(LED1_PORT, LED1_PIN);Gpio_SetIO(LED2_PORT, LED2_PIN);delay1ms(500); // while 里面必须有个延迟,不然while(1)把cpu占用了,进不了中断。Gpio_ClrIO(LED1_PORT, LED1_PIN);Gpio_ClrIO(LED2_PORT, LED2_PIN);delay1ms(500);}
}
user_adc.c
#include "user_adc.h"
#include "gpio.h"
#include "bgr.h"
#include "adc.h"uint16_t Trim = 0;
uint32_t u32AdcRestult;float temperature = 0;// ADC端口 配置
void adc_gpio_config(void)
{ Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); // 开启ADC/BGR GPIO外设时钟Gpio_SetAnalogMode(GpioPortA, GpioPin0); // PA00 (AIN0)
}// ADC模块 初始化
void adc_config(void)
{stc_adc_cfg_t stcAdcCfg;DDL_ZERO_STRUCT(stcAdcCfg);// 开启ADC/BGR外设时钟Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE);Bgr_BgrEnable(); // 开启BGRBgr_TempSensorEnable(); // ▲【开启温度传感器】 // ADC 初始化配置stcAdcCfg.enAdcMode = AdcSglMode; // 采样模式-单次stcAdcCfg.enAdcClkDiv = AdcMskClkDiv1; // 采样分频-1stcAdcCfg.enAdcSampCycleSel = AdcMskSampCycle12Clk; // 采样周期数-12stcAdcCfg.enAdcRefVolSel = AdcMskRefVolSelInBgr2p5; // 参考电压选择-内部2.5VstcAdcCfg.enAdcOpBuf = AdcMskBufEnable; // ▲ OP BUF配置-开stcAdcCfg.enInRef = AdcMskInRefEnable; // 内部参考电压使能-开stcAdcCfg.enAdcAlign = AdcAlignRight; // 转换结果对齐方式-右Adc_Init(&stcAdcCfg);
}// ADC 单次采样模式 配置
void adc_sgl_config(void)
{// 配置单次采样通道Adc_CfgSglChannel(AdcAiTsInput);// 启动单次一直采样Adc_SGL_Always_Start();
}void user_adc_init(void){adc_gpio_config();adc_config();adc_sgl_config();
}void get_temperature(void){if(TRUE == Adc_GetIrqStatus(AdcMskIrqSgl)){// 获取采样值Trim = *((uint16_t *)(0x00100C36)); // ▲ 2.5V对应的地址u32AdcRestult = Adc_GetSglResult();temperature = 25 + 0.2135 * (float)(u32AdcRestult - Trim );// ▲ 0.2135 = 0.0854 ×2.5Adc_ClrIrqStatus(AdcMskIrqSgl); }
}
user_dac.h
#ifndef _USER_ADC_H_
#define _USER_ADC_H_#include "ddl.h"extern float temperature;
extern uint16_t Trim;
extern uint32_t u32AdcRestult;void adc_gpio_config(void);
void adc_config(void);
void adc_sgl_config(void);
void user_adc_init(void);
void get_temperature(void);#endif
读出的环境温度被保存到了全局变量 temperature 中,在线断点调试可以添加到watch中查看。

感谢您的阅读,欢迎留言讨论、收藏、点赞。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
