主题中讨论的其他器件: LM35
我尝试使用 MSP430FR6928的内部传感器提供的温度。 对于类似器件、我遵循了一个"开箱即用"应用中显示的建议。
在 ADC12_B 的配置中(程序只在代码开始时运行一次)、我执行了以下操作(包括那些与温度相关的指令:
void InitADC12_B (void){
// 1. 我创建了这个常量(浮点数) 、该常量在程序运行期间仅计算一次:
Tmprtr_FACTOR = (((85-30)* 10)/(浮点)((CALADC12_12V_85C - CALADC12_12V_30C)* 10);
// 2. 我使用了1.2V 基准、这就是我使用的设置:
while (Ref_A_isRefGenBusy (REF_A_BASE)
;
REF_A_setReferenceVoltage (REF_A_BASE、REF_A_VREF1_2V); //选择内部基准电压= 1.2V
Ref_A_enableReferenceVoltage (REF_A_BASE); //内部基准打开
Ref_A_enableTempSensor (REF_A_BASE);
while (! Ref_A_isVariableReferenceVoltageOutputReady (REF_A_base)
;
//我找到了2个设置参考的例子...一个使用的 Ref_a_isRefGenBusy()和另一个使用的 Ref_a_isVariableReferenceVoltageOutputReady()...根据 DriverLib 手册中这些函数的描述,我无法理解使用了哪一个...所以我两者都使用了。
// 3. 我将使用5MHz 时钟作为 ADC12_B 时钟、因此我使用了256和512个采样周期。 这似乎是足够的。 我无法找到结果的差异。
ADC12_B_setupSamplingTimer (ADC12_B_B_B_B_B_B_B_B_B_B_base、 //这些是 ADC12CTL0寄存器中的 SHT0x 位
ADC12_B_CYCLEHOLD_512_CYCLES、
ADC12_B_CYCLEHOLD_16_CYCLES、 //这是默认值5MHz 至少4分频
ADC12_B_MULTIPLESAMPLESENABLE); //无需为每次转换应用触发器。
ADC12_B_initParam initParam ={0}; // initParam 是结构 ADC12_B_initParam 的实例
initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;//程序代码将启动转换(SC)(默认)
initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC; // CS 上的 MODOSC 5 MHz 将是转换器时钟(默认)
initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1; //该分频器也是默认的
initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1; //这也是分频器
initParam.internalChannelMap = ADC12_B_TEMPSENSEMAP; //引出监测内核温度的内部传感器
// initParam.internalChannelMap = ADC12_B_NOINTCH; //使用内部通道(例如 temp)、因此此参数被注释掉
ADC12_B_init (ADC12_B_base、&initParam);
// 4. 温度转换的结果进入存储器4:
//存储器4内部温度传感器
configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_4;
configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_TCMAP; //configureMemoryParam.inputSourceSelect =温度
configureMemoryParam.refVoltageSourceSelect = ADC12_B_VREFPOS_INTBUF_VREFNEG_VSS;
configureMemoryParam.endOfSequence = ADC12_B_ENDOFsequence;
configureMemoryParam.window比较 器选择= ADC12_B_WINDOW_Comparator_DISABLE;
configureMemoryParam.differalModeSelect = ADC12_B_different_mode_disable;
ADC12_B_configureMemory (ADC12_B_B_B_B_B_B_B_B_B_B_base、&configureMemoryParam);
// 5. 启动转换周期、当中断出现时...我就是这样做:
Raw_Tmprtr =(ADC12_B_getResults (ADC12_B_B_B_B_B_B_B_B_B_B_B_B_MEMORY_4)- CALADC12_12V_30C);
Last_die_Tmprtr = 10 *(长) Raw_Tmprtr * Tmprtr_FACTOR + 300;
可以看出,温度结果乘以10 ,最终在 last_die_Tmprtr ...这个 结果被保存到一个数组中,并最终被移动到 PC。
也许我错了这个、但是我认为在中断内部执行一个指令运算比进行一个除法运算更有效。
时间安排不是问题。 每2秒、uController 会执行5次测量、然后返回而不执行任何操作。
我的问题是:温度测量每2秒执行一次。 结果可以相互接近、但有时
达到2°C。 我用于开发的板几乎是空的。 它仅包含 uController、去耦电容器、对器件编程和提供对串行端口的访问的连接器、以及提供3.3V 为器件供电的基准电压发生器。 大多数测试是使用编程器提供的电压执行的。 我将使用 A2D 的多个输入、但此时它们没有信号并 通过10K 电阻器接地。 在着手构建数字滤波器之前、我想知道我的结果是否合理、或者我遇到了一些必须纠正的电气或固件问题。 我已经测试了其他监控外部信号的通道、它们对我来说看起来非常合理。 但对于所有其他通道/测量、我将使用3.3V 的外部基准。
此致