您好!
我们正在一个项目中使用 MSP430L092、该项目要求频繁测量器件温度 、以便能够适当地调整其他传感器值。 在对温度传感器进行一些测试时、我提出了几个问题。 首先、该值似乎会发生漂移、这取决于 ADC 配置。 第二、当使用公式将 ADC 值转换为温度时、我的值甚至不接近于器件的环境温度。 下面是我正在使用的测试程序:
#include "msp430.h";#define controlled include file name main;模块名称 public main;使主标签可见 ;在该模块之外 #define true 1 #define false 0 ; 中断矢量 ; ORG 0FFE0h DC16 INVINT;无效中断--只返回 DC16 INVINT; 无效中断--只返回 DC16 INVINT;无效中断--只返回 DC16 INVINT;无效中断--只返回 DC16 INVINT;无效中断--只返回 DC16 INVINT;I?O 端口 P2 (P2IFG.0至 P2X.3) DC16 INVINT;Timer0_A3 (TA0CCR1 CCIFG1 ;中断 DC16 INVINT) Timer0_A3 (TA0CCR0 CCIFG0)-发送中断 DC16 INVINT;I/O 端口 P1 (P1IFG.0至 P1IFG.6) DC16 APOLINT;A-POOL (CxIFG) DC16 WDTIRQ;WDTIFG DC16 INVINT;Timer1_CCR1 CC16 INCC16 (TAMIFG CC1) NCC16 CC1 NMI 中断 CC1 (CC1) 系统 NMI (SVMIFG、VMAIFG) DC16初始化;复位矢量地址 RSEG CSTACK;段 RSEG DATA16_Z TempLog DS8 50的预先声明;温度存储区域 RSEG 代码;将程序置于'code'段 初始化:MOV #SFE (CSTACK);SP;设置堆栈 主:NHOLD+WDTV;WDTW 主程序 停止看门狗计时器 ;清除日志 MOV.W #50、R13 MOV.W #TempLog、R14 Clear1 MOV.B #0、0 (R14) Inc. W R14 DEC.W R13 JNZ Clear1 ; 设置时钟 ; MOV.W #CCSKEY、&CCSCTL0;解锁 CCS Clock1 MOV.W R13 OFW CLF;清除启动 时钟;SFIFG #0、SFIFG 0、SFIFG、SFIFG 0 振荡器标志? JNZ Clock1 MOV.W #0000h、&CCSCTL4;将 ACLK、SMCLK 和 MCLK 设置回 HFCLK MOV.W #DIVA_0+DIVS_0+DIVM_0、&CCSCTL5;ACLK/1 (1000 KHz)、SMCLK /1 (1000 KCLK)(1000 KCLK)、 CCTRL 0和 MOCLK 0的默认值;以及1000 KCLK 0的默认值和 MOCLK 值(1000 KCLK );将1000 KCLK 和 MOCLK 值转换为0)。 指向日志存储区域开始 的指针 TESTRX0 ;开始配置 A-POOL 寄存 器 MOV.W #0、&APCTL MOV.W #REFTSEL、&APTRIM MOV.W #TMPSEN、&APVDIV;启用温度传感器 MOV.W #CMPL+DBON+CONV+APTRS+APSW+APSW+4; 启用温度传感器 MOLDC+APSW+APSW_4;进行参考测量 ;APCTRLSW+APSW+EMCL_4、APSW_4、APSW_IN_IN_TREMCLSW_4、APSW_IN_TREMCLSW_4;启用温度转换 设置信道和开始转换 #else MOV.W #OSEL+oden+APPSEL_5+APNSEL_4、&APCTL;设置信道和开始转换 #endif MOV.W #0、&APIFG MOV.W #0、&APINT BIS.W #RUNSTOP+CBSTPSTPSR+APCTL、&APCTL; 如果 已完成转换,则使用#TRIFG 标志#TOP0+ TOP0+ TOP0+ TOP0+ TOP0;如果已完成,则使用中断#APESTRG0+ TOP0+ TOP0+ TOP0+ TOP0+ TOP0+ TOP0+ TOP0+ TOP0+ TOL 在启用中断 #endif MOV.W &APINT、R10 MOV.B R10、0 (R14)的情况下输入 LMP0;获取传感器数据并记录 其事件 W R14;碰撞日志指针 DEC.W R13;查看是否完成 JZ TESTRX3 MOV.W #10000、R12 调用#delay; 提供一点延迟来模仿正常采样 #if true JMP TESTRX1 #else JMP TESTRX0 #endif TESTRX3 JMP $;完成后锁定在此 ; ; delay ; ;;用于软件延迟 ;输入时: ; R12=计数(1=100.0usec); ;********* 延迟推送 W R10 推送 W R12 Delay2 MOV.W #8、R10 Delay3 NOP NOP DEC.W R10 JNE Delay3 NOP NOP NOP NOP NOP DEC.W R12 JNE Delay2 POP.W R12 POP.W R10 RET ; ;系统中断功能 ;********* ;********* ;* ;*未使用/无效中断处理 ;* ;********* INVINT NOP RETI ;* ;*看门狗定时器中断处理 ;* ;********* WDTIRQ NOP RETI ;* ;*用户 NMI 中断处理 ;* ;********* USERNMI NOP RETI ;* ;*系统 NMI 中断处理 ;* ;********* SYSTEMNMI NOP RETI ;********* ;* ;* APOOL 中断处理 ;* ;********* APOLINT NOP MOV.W #0、&APIFG;清除中断标志 BIC.W #LPM0 (SP);修改 SP 使其进入激活模式 RETI 结束
在测试过程中、我在样本之间延迟大约1秒、以帮助模拟将在应用中使用的实际温度采样率(每分钟1个样本、但获得的结果与我在此处进行的测试类似)。 如果我使用 APPSEL_5+APNSEL_4、温度漂移会向上。 典型 ADC 值如下所示:
00 A4 A3 A4 A4 A5 A4 A5 A5 A5 A5 A5 A5 A5 A6 A6 A6 A6
A7 A7 A7 A7 A7 A7 A8 A8 A9 AA A9 aa A9 aa A9 aa A9 aa A9 aa aa aa A9 aa aa aa aa aa aa A9 aa
AB AA AB AB AB AC AD AE AD AD AD AD AD AD AD A AD
Ae
如果我使用 OSWP+APPSEL_4+APNSEL_5配置、值会向下漂移、如下所示:
00 A7 A8 A7 A7 A7 A7 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6 A6
A5 A4 A4 A5 A2 A3 A3 A3 A3 A2 A3 A2
A2 A2 A2 A1 A2 A1 A2 A2 A2 a0 A1 a0 a0 a0 a0 a0 a0 a1 9f
A0 9f
无论是轮询 ADC 转换还是使用转换完成中断、似乎没有什么不同。 无论我是复位所有配置参数还是复位上面代码中显示的子集、似乎也没有什么不同。 这种漂移的原因是什么?可能的解决方案是什么?
在第二个问题上、使用 MSPL092示例代码中的公式:
degC =((((ADCValue - 179)* 125)/58)+ 30
如果值为0xA7、则得出的温度为-2摄氏度、这不是器件的温度。 我知道该公式源自
Vsensor = Voffset25 + TCsensor*(Ta - 30)
这来自 MSP430L092数据表的第30页。 首先、我是否正确进行了计算? 其次、假设我是、那么对于我的系统、Voffset25和/或 TCsensor 的值必须不同。 如何找到这些值? 最后、如果我使用的公式正确且我使用正确、则意味着 ADC 值中的每个阶跃都对应于~2.1摄氏度阶跃、这对于我们的目的而言不够敏感。 因此、我希望我做了一些错误、或者有一种方法可以调整该传感器的灵敏度。
期待您提供任何帮助。
此致、
Robert Buchanan