杰发科技AC7840——使用内部温度

1. 简介

杰发的芯片都自带内部温度检测,在ADC通道中获取即可。

7801自带了温度检测例程,7840不带,因此在这里分享一下相关温度检测代码。

根据产线反馈,7840在常温时候25℃比较准,温箱测试,高温和低温下有5℃的误差。

2. 使用BG校准,增大采样时间

直接采集内部温度adc通道,值不是很准确,可以考虑使用内部BG对ADC值进行校准。

cpp 复制代码
void ADC_Init(void)
{
    adc_converter_config_t adcConfig;

    /*! ADC输入端口(电位器)配置*/
    GPIO_DRV_SetMuxModeSel(VR1_PORT, VR1_PIN, PORT_PIN_DISABLED); /*! 电位器VR1*/
    GPIO_DRV_SetMuxModeSel(VR2_PORT, VR2_PIN, PORT_PIN_DISABLED); /*! 电位器VR2*/

    /*! ADC配置
    配置ADC为12位分辨率,工作模式为MODE3规则组扫描+注入组扫描模式多通道单次转换,规则组长度为4。
    每触发一次进行一次ADC转换,每次转换规则组中的4个通道。
    */
    ADC_DRV_Init(ADC_INDEX);
    ADC_DRV_InitConverterStruct(&adcConfig);
    adcConfig.clockDivide                = ADC_CLK_DIVIDE_6;     /*! ADC时钟分频。ADC时钟源选择在时钟初始化里配置,此例程选择为SPLLDIV2_CLK,频率为60MHz*/
    adcConfig.resolution                 = ADC_RESOLUTION_12BIT; /*! ADC分辨率设置*/
    adcConfig.regularTrigger             = ADC_TRIGGER_INTERNAL; /*! 规则组触发源类型选择*/
    adcConfig.injectTrigger              = ADC_TRIGGER_INTERNAL; /*! 注入组触发源类型选择*/
    adcConfig.dmaEnable                  = false;                /*! DMA使能位*/
    adcConfig.voltageRef                 = ADC_VOLTAGEREF_VREF;  /*! ADC参考电压源选择,VREF/VDDA*/
    adcConfig.scanModeEn                 = true;                 /*! 工作模式配置:扫描模式使能位,多通道时需要使能扫描模式,单个通道时不需要使能扫描*/
    adcConfig.continuousModeEn           = false;                /*! 工作模式配置:连续模式使能位,1:触发后可连续转换,0:触发一次只转换一次,转换完成后停止*/
    adcConfig.regularDiscontinuousModeEn = false;                /*! 工作模式配置:规则组不连续模式使能位*/
    adcConfig.injectDiscontinuousModeEn  = false;                /*! 工作模式配置:注入组不连续模式使能位*/
    adcConfig.injectAutoModeEn           = false;                /*! 工作模式配置:自动注入模式使能位*/
    adcConfig.intervalModeEn             = false;                /*! 工作模式配置:间隔模式使能位*/
    adcConfig.regularDiscontinuousNum    = 0;                    /*! 规则组子组长度 (用于mode7)*/
    adcConfig.regularSequenceLength      = 4;                    /*! 规则组长度设置*/
    adcConfig.injectSequenceLength       = 0;                    /*! 注入组长度设置*/
    adcConfig.powerEn                    = true;                 /*! ADC上电*/
    ADC_DRV_ConfigConverter(ADC_INDEX, &adcConfig);              /*! 初始化ADC配置*/

    /*! ADC通道配置*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_0, VR1_ADC_CH);     /*! 电位器VR1对应通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_1, VR2_ADC_CH);     /*! 电位器VR2对应通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_2, ADC_CH_TSENSOR); /*! 内部温度传感器通道*/
    ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_3, ADC_CH_BANDGAP);  /*! ADC_CH_BANDGAP   */ 
		//ADC_ConfigChannel(ADC_INDEX, ADC_RSEQ_4, ADC_CH_SUPPLY);  /*! 内部供电电压通道*/
}

对采样时间没有要求的话,在初始化时候可以增加采样时间

cs 复制代码
/*!
    ADC采样转换时间计算:
        FCLK 时钟源为SPLLDIV2_CLK,频率为60MHz
        ADCCLK = FCLK/clockDivide = 60/6 = 10MHz
        总转换时间 = (SPT+ resolution(12/10/8))×ADCCLK周期+5个FCLK = (5+12)/10+5/60 ≈ 1.78us

    注意:12bit分辨率最大转换率为1Msps,10bit分辨率最大转换率为1.2Msps,8bit分辨率最大转换率为1.4Msps
    */

周期5是1.78us,按照公式计算,185是 (5+12)/10+185/60 = 4.78us

在计算时候使用BG进行校准

bg电压在开发板上测试,3.3v时候测出来是1500,5V时候测出来960左右。

BG电压实际上1.2V,即1200mV,对应的是1200的ad值才对,目前7801上测试1200很准,可能7840的值和7801不一样。

cpp 复制代码
void ADC_TriggerTest(void)
{
    ADC_DRV_SoftwareStartRegularConvert(ADC_INDEX);              /*! ADC软件触发*/
    while (!ADC_DRV_GetConvCompleteFlag(ADC_INDEX, ADC_RSEQ_3)); /*! 等待ADC最后一个通道转换完成*/

    ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_0, &g_adc_array[0]); /*! 获取规则组0的转换值*/
    ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_1, &g_adc_array[1]);
    ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_2, &g_adc_array[2]);
    ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_3, &g_adc_array[3]);
		//ADC_DRV_GetSeqResult(ADC_INDEX, ADC_RSEQ_3, &g_adc_array[4]);

    /*! 打印ADC各通道转换结果*/
	
		convertVal = (float)g_adc_array[2]  / (float)g_adc_array[3];   // bgADC /1200 =  TempADC/TempVol
		convertVol = convertVal*1200;
		temperatureVal = 25 - (convertVol - 673  )/1.788 ;
}
相关推荐
独小乐1 天前
019.ADC转换和子中断|千篇笔记实现嵌入式全栈/裸机篇
linux·c语言·驱动开发·笔记·嵌入式硬件·mcu·arm
电子科技圈3 天前
SmartDV展示完整的边缘与连接IP解决方案,以高速和低功耗特性赋能移动、物联网和媒体处理设备创新
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
天月风沙3 天前
Betaflight飞控、树莓派RP2350B主控编译教程
linux·单片机·嵌入式硬件·mcu·无人机·树莓派
电子科技圈4 天前
芯科科技2026 Tech Talks技术讲座启航聚焦无线与边缘 AI,共绘智能物联新蓝图
人工智能·嵌入式硬件·mcu·物联网·智能家居·智能硬件·iot
EVERSPIN5 天前
低功耗MCU对TWS充电仓的驱动控制
单片机·嵌入式硬件·mcu·低功耗mcu
白掰虾6 天前
STM32CubeMX2教程——STM32C5 UART
stm32·单片机·嵌入式硬件·mcu·usart·stm32cubemx2·stm32c542
狂奔蜗牛(bradley)8 天前
使用数组重构责任链实现通信协议解析
网络·mcu·重构
狂奔蜗牛(bradley)8 天前
嵌入式软件中如何用责任链模式重构串口协议栈
网络·单片机·mcu·重构·责任链模式
咸鱼嵌入式9 天前
【AutoSAR】详解CANIF模块
单片机·mcu·车载系统·autosar
EVERSPIN10 天前
高性能32位MCU在热敏打印机上的应用
单片机·嵌入式硬件·mcu·32位mcu