This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
我在使用 ADC12获取值时遇到了一个奇怪的问题。 我想测量 A12上的电压。 电压读数应为0.89v、但我正在使用的代码似乎没有读出。 它只是得到0.0A 的帮助会很好。
谢谢、
------
float 电压; float bat_voltage (void) { ADC12CTL0 = ADC12SHT02 + ADC12ON; // 16个样本-采样时间、ADC12打开 ADC12CTL1 = ADC12SHP; //使用采样计时器 ADC12MCTL0 = ADC12INCH_12 + ADC12EOS; //选择 A12作为源输入 ADC12IE = 0x01; //启用中断 ADC12CTL0 = ADC12ENC; //启用转换 P7SEL |= BIT0; //选择 ADC 进行电池电压测量 int voltctl = 1000; //读取计时器以获取电压读数...然后放弃 while (voltctl >0) { ADC12CTL0 |= ADC12SC; //采样和转换开始 voltcttl-; //递减读取定时器 _bis_SR_register (LPM0_bits + GIE); // LPM0、ADC12_ISR 将强制退出 } if (voltctl = 0) { 电压= 99.9; //如果此代码超时,请将电压更改为99.9以指示错误 } 其他 { __no_operation(); //调试 } 返回电压; } // #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_ICC__) #pragma vector=ADC12_vector __interrupt void ADC12ISR (void) #Elif defined (__GNU__) void __attribute__((interrupt (ADC12_vector))#defineer (void ADC12ISR (void)))(void 编译器错误))(不支持 ADC12ISR! #endif { switch (__even_in_range (ADC12IV、34)) { case 0:break; //向量0:无中断 情况2:中断; //向量2:ADC 溢出 情况4:中断; //向量4:ADC 时序溢出 情况6:中断; //向量6:ADC12IFG0 情况8:中断; //向量8:ADC12IFG1 大小写10:break; //向量10:ADC12IFG2 大小写12:break; //向量12:ADC12IFG3 case 14:break; //向量14:ADC12IFG4 情况16:中断; //向量16:ADC12IFG5 情况18:中断; //向量18:ADC12IFG6 案例20:中断; //向量20:ADC12IFG7 case 22:break; //向量22:ADC12IFG8 case 24:break; //向量24:ADC12IFG9 大小写26:break; //向量26:ADC12IFG10 case 28:break; //向量28:ADC12IFG11 情况30: //向量30:ADC12IFG12 电压= ADC12MEM12; //从 A12移动结果,IFG 被清除 _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出活动 CPU break; case 32:break; //向量32:ADC12IFG13 case 34:break; //向量34:ADC12IFG14 默认值:break; } }
尊敬的 Chris:
将 ADC12CTL0寄存器中的 ADC12ENC 位置位时、将覆盖先前的设置:
ADC12CTL0 = ADC12ENC;
启用 ADC 转换的正确方法是使用|=操作:
ADC12CTL0 |= ADC12ENC;
此致、
Caleb Overbay
谢谢 Caleb、
这很有帮助。 但我仍然看不到任何数据。 今天、我将尝试在 LaunchPad 上尝试使用此代码、以删除任何硬件变量。 然后、我将尝试一个示例代码并对其进行修改、直到我看到发生了什么情况。
我本以为用户会提供足够的信息、这样我就可以设置任何类型的 ADC、但只是描述了寄存器、并不清晰。
这就是代码示例出现的原因。 driverLib 手册提供了一个示例:
/*初始化 ADC (MCLK/1/4)*/ MAP_ADC14_enableModule (); MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、 0); /*配置 GPIO (5.5 A0)*/ MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、 GPIO_TIVE_MODULE_Function); //配置 ADC 内存*/ MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);MAP_ADC_REVC_ADC_REVA0 、ADC_REEP_ADC_REV0_ADC_REOPEN_ADC14、ADC_ADC_ADC0 false); //配置采样计时器*/ MAP_ADC14_enableSampleTimer (ADC_MANUAL_DETERY); //启用/切换转换*/ MAP_ADC14_enableConversion(); MAP_ADC14_TOGLEConversionTrigger(); // ADC 中断处理程序。 每当 ADC_MEM0完成转换*时、就会调用此处理程序。 */ void ADC14_IRQHandler (void) { uint64_t status = MAP_ADC14_getEnabableInterruptStatus (); MAP_ADC14_clearInterruptFlag (status); if (ADC_INT0 & status) { ADCResult = MAP_ADC14_getResources(ADC14); ADC14_Contract_ADC14_ADC3.3V);ADC14_Contractuertog_ADC14_Conversion_ADC384 ( *= ADC14);ADC14_ADC=ADC=ADC=ADC=ADC