您好!
我将在以下配置下运行一个项目:MSP430FR2111、 driverlib 2.80.0.001、CCS 8.1.0.00011、优化级别4以支持大小
我初始化 ADC:
ADC_setupSamplingTimer (ADC_base、ADC_CYCLEHOLD_1024_cycles、ADC_MULTIPLESAMPLESENABLE);
我每1秒采样一些相当稳定的电压-我得到相当稳定的读数~540 ADC 计数。
由于电压相当稳定且输出阻抗较低(去耦电容器)、因此 I-VERT 尝试减少采样保持时间
现在、当我使用除 ADC_CYCLEHOLD_512_cycles (甚至低至4个周期)以外的任何值对采样计时器进行初始化时、我获得大致相同的读数(~540)
但是、当我使用 ADC_CYCLEHOLD_512_CYCLES 对其进行初始化时、我会收到交替读取:415 - 670 - 415 - 670、平均值为~540 (稳定值)
由于我的代码存储器非常有限、因此我必须使用最高优化级别、这会给调试带来麻烦。 基本流程如下:
- 每1秒-
- 配置 ADC 对通道 2进行采样:ADC_CONFIGureMemory (ADC_base、ADCINCH_2、ADC_VREFPS_INT、ADC_VREFNEG_AVSS);
- 启动单通道重复转换(通道2):ADC_startConversion (ADC_base、ADC_REPEATE_SINGLECHANNEL);
- 在 ISR 内-
- 我将 ADC 读数汇总到全局 数组 <<我在"Memory"视图中检查这个数组
- 我进行4次求和、然后禁用转换 ADC_DisableConversions (ADC_base、true);
- 我对4个样本求和平均值、然后得到一个我执行操作的平均读数
- 如果采样通道=ADCINCH_2
- 配置 ADC 对通道1进行采样:ADC_CONFIGureMemory (ADC_base、ADCINCH_1、ADC_VREFPS_INT、ADC_VREFNEG_AVSS);
- 启动单通道重复转换(通道1):ADC_startConversion (ADC_base、ADC_REPEATE_SINGLECHANNEL);
- 1秒后重复
这种超级尴尬行为的原因是什么? 这是优化问题吗? 为什么仅适用于 ADC_CYCLEHOLD_512_cycles???
请提供任何指示。
谢谢
#pragma vector=ADC_vector __interrupt void ADC_ISR (void) { static uint8_t avgCycle = AVG_factor;// 4 uint8_t source; switch (_even_in_range (ADCIV、12))){ 情况0:中断;//无中断 情况2:中断;//转换结果溢出 情况4:中断;//转换时间溢出 案例6:中断;//ADCHI 案例8:中断;//ADCLO 案例10:中断;//ADCIN 情况12://ADCIFG0 //通过读取内存缓冲 区源= ADCMCTL0 & ADCINCH; Measurement[source]+= ADC_getResults (ADC_base);// Gloabl 自动清除 ADCIFG0。 已在内存窗口 avgCycle 中检查-; if (avgCycle = 0){// avgCycle = 0 && source = 0。 采样序列结束 ADC_DisableInterrupt (ADC_base、ADC_completed_interrupt); ADC_DisableConversions (ADC_base、true); avgCycle = AVG_factor; 测量[来源]/= AVG_FACTOR; //...... if (source =ADCINCH_2){ ADC_configureMemory (ADC_base、ADCINCH_1、ADC_VREFPOS_INT、ADC_VREFNEG_AVSS); ADC_enableInterrupt (ADC_base、ADC_completed_interrupt); ADC_startConversion (ADC_base、ADC_REPEARD_SINGLECHANNEL); } }//如果 avgCycle =0 break;// case 12 } //开关__even_in_range () LPM3_exit;// ISR 内部退出 LPM3 }