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.
你好
我对以下代码有2个问题、这些代码正常工作。 如果完全覆盖了连接到 ADC12_A 输入(引脚6.0)的光电电阻器、则代码的目的是打开连接到引脚1.0的 LED、否则它会关闭 LED。
问题是:
1 - ADC12_A 的默认分辨率是多少? 根据数据表、使用 ADC12CTL2寄存器中的 ADC12RES 位来定义分辨率。 它可以是8、10、0r 12。 在以下代码中、ADC12RES=0表示分辨率是8位、 但分辨率是12而不是8?
2 -在此代码中、转换结果可在 ADC12MEM0存储器寄存器中获得。 默认情况下、引脚6.0是否连接到此寄存器? 我想我们需要明确地配置 ADC12MEM0存储器寄存 器、以便使用 ADC12MCTL0控制寄存器从其中一个 ADC12输入引脚读取数据。 我的理解是否正确?
代码如下:
--------------------------------------------------------------------
#include
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
ADC12CTL0 = ADC12SHT00 + ADC12ON;//采样时间、ADC12打开
ADC12CTL1 = ADC12SHP+ADC12SSEL1;//使用采样定时器+定时器时钟为 ACLK
ADC12IE = ADC12IE0;//启用中断,也可以使用0x01
ADC12CTL0 |= ADC12ENC;
P6SEL |= BIT0;// P6.0 ADC 选项选择
P1DIR |= BIT0;// P1.0输出
P1OUT &=~BIT0;
while (1)
{
ADC12CTL0 |= ADC12SC;//开始采样/转换
_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出
}
}
#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)
{
switch (__evo_in_range (ADC12IV、34))
{
情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
如果(ADC12MEM0 < 0x7ff)// ADC12MEM = A0 < 0.5AVcc?
P1OUT &=~BIT0;// P1.0 = 1
其他
P1OUT |= BIT0;// P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
情况8:中断;//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14
默认值:break;
}
}
----------------------------------------------------
谢谢
Mahmoud
1) 1) ADC12RES=2、因此如果您不对其进行更改、分辨率为12位。 [参考用户指南(SLAU208Q)表28-6.] 此代码看起来需要12位。
2) 2)使用 ADC12MCTL0:ADC12INCH 设置 MEM0的 AN。 复位时 ADC12MCTL=0、因此如果你不改变它、它指 A0 (INCH=0)。 [参考用户指南表28-8]。 您使用的是(省略) CONSEQ=0、它使用 MCTL0/MEM0 (除非您使用 ADC12CTL1:ADC12CSTARTADD 进行更改)。
未经请求:
>ADC12CTL1 = ADC12SHP+ADC12SSEL1;//使用采样定时器+定时器时钟为 ACLK
ADC12SSEL1是位名称、而不是字段值、因此这实际上会设置 ssel=2。 要获得 ssel=1、请使用 ADC12SSEL_1。
尊敬的 Bruce:
我希望你们有一个安全和快乐的感恩节假期。 非常感谢您的详细答复。
我仍在为您的最后一条评论而挣扎、请您详细解释为什么 ACD12SSEL1设置 ssel=2? 位名称和字段名称之间有何区别?
谢谢
Mahmoud
。
ADC12SSEL1只是 ADC12SSEL 域的位1 (而不是位0)。 ADC12SSEL_1是 ADC12SSEL 域中的值1。 您的注释显示您需要 ACLK、在 ADC12SSEL 字段中该值为1。
#define ADC12SSEL0 (0x0008)/* ADC12时钟源选择位:0 */ #define ADC12SSEL1 (0x0010)/* ADC12时钟源选择位:1 */ [...] #define ADC12SSEL_0 (0*8u)/* ADC12时钟源选择:0 */ #define ADC12SSEL_1 (1*8u)/* ADC12时钟源选择:1 */ #define ADC12SSEL_2 (2*8u)/* ADC12时钟源选择:2 */
在实践中、我几乎从未使用位名称、但我想应该定义它们、因为它们在用户指南中。
[编辑:添加了 ssel_2进行比较。]
感谢 Bruce 的回答。
我还有一个关于多通道 ADC 的问题。 以下代码转换 A0 (6.0)和 A1 (6.1)的模拟输入。 它会根据输入电压使板载 LED 闪烁。 不幸的是,它不起作用。 如果我发生配置错误、请告诉我。
#include
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
ADC12CTL0 |= ADC12SHT0_0 + ADC12ON;//采样时间、ADC12打开
ADC12CTL1 |= ADC12SHP+ADC12SSEL_1_ADC12CONSEQ_1;//使用采样定时器+定时器时钟为 ACLK+通道序列
ADC12MCTL0|=ADC12INCH_0;// A0=6.0
ADC12MCTL1|=ADC12INCH_1_ADC12EOS;// A1=6.1、序列结束
ADC12IE = ADC12IE0+ADC12IE1;//启用来自 MEM0和 MEM1的中断、
ADC12CTL0 |= ADC12ENC;
P6SEL |= BIT0+BIT1;// P6.0 ADC 选项选择
P1DIR |= BIT0;// P1.0输出
P1OUT &=~BIT0;
P4DIR |= BIT7;// P4.7输出
P4OUT &=~BIT7;
while (1)
{
ADC12CTL0 |= ADC12SC;//开始采样/转换
_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出
}
}
#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)
{
switch (__evo_in_range (ADC12IV、34))
{
情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
如果(ADC12MEM0 < 0x7ff)// ADC12MEM0 = A0 < 0.5AVcc?
P1OUT &=~BIT0;// P1.0 = 1
其他
P1OUT |= BIT0;// P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断;
案例8:
如果(ADC12MEM1 < 0x2ff)// ADC12MEM1 = A1 < 0.5AVcc?
P4OUT &=~BIT7;// P4.7 = 1
其他
P4OUT |= BIT7;// P4.7 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断;//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14
默认值:break;
}
}
根据用户指南(SLAU208Q)第28.2.7.2节、必须明确清除 ADC12SC (然后再进行设置)、并且 CONSEQ=1。 这是不明显的,事实上我自己忘记了。 这句话是指"序列"、但由于您的 MSC=0、因此实际上是在每次转换后。
因此、只需在设置 ADC12SC 之前添加以下内容:
>ADC12CTL0 &=~ADC12SC; //清除以进行下一次转换
谢谢 Bruce、我已经尝试了您的建议。 它部分工作、因为我目前只能看到 ADC12将数据放置在 MEM1中的指示。 MEM0无响应。 因此在以下代码中、仅 LED 4.7关闭和打开。 请给出建议。
#include
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
ADC12CTL0 |= ADC12SHT0_8 + ADC12ON;//采样时间、ADC12打开
ADC12CTL1 |= ADC12SHP+ADC12SSEL_1_ADC12CONSEQ_1;//使用采样定时器+定时器时钟为 ACLK+通道序列
ADC12MCTL0|=ADC12INCH_0;// A0=6.0
ADC12MCTL1|=ADC12INCH_1_ADC12EOS;// A1=6.1、序列结束
ADC12IE = ADC12IE0+ADC12IE1;//启用来自 MEM0和 MEM1的中断、
ADC12CTL0 |= ADC12ENC;
P6SEL |= BIT0+BIT1;// P6.0 ADC 选项选择
P1DIR |= BIT0;// P1.0输出
P1OUT &=~BIT0;
P4DIR |= BIT7;// P4.7输出
P4OUT &=~BIT7;
while (1)
{
ADC12CTL0 &=~ADC12SC;
ADC12CTL0 |= ADC12SC;//开始采样/转换
_bis_SR_register (LPM0_bits + GIE);// LPM0、ADC12_ISR 将强制退出
}
}
#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)
{
switch (__evo_in_range (ADC12IV、34))
{
情况0:中断;//向量0:无中断
情况2:中断;//矢量2:ADC 溢出
情况4:中断;//矢量4:ADC 时序溢出
情况6://向量6:ADC12IFG0
如果(ADC12MEM0 < 0x2ff)// ADC12MEM0 = A0 < 0.5AVcc?
P1OUT &=~BIT0;// P1.0 = 1
其他
P1OUT |= BIT0;// P1.0 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
中断;
案例8:
如果(ADC12MEM1 < 0x2ff)// ADC12MEM1 = A1 < 0.5AVcc?
P4OUT &=~BIT7;// P4.7 = 1
其他
P4OUT |= BIT7;// P4.7 = 0
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
//向量8:ADC12IFG1
情况10:中断;//向量10:ADC12IFG2
情况12:中断;//向量12:ADC12IFG3
案例14:中断;//矢量14:ADC12IFG4
情况16:中断;//向量16:ADC12IFG5
情况18:中断;//向量18:ADC12IFG6
情况20:中断;//向量20:ADC12IFG7
情况22:中断;//向量22:ADC12IFG8
情况24:中断;//向量24:ADC12IFG9
情况26:中断;//向量26:ADC12IFG10
情况28:中断;//向量28:ADC12IFG11
情况30:中断;//向量30:ADC12IFG12
情况32:中断;//向量32:ADC12IFG13
案例34:中断;//矢量34:ADC12IFG14
默认值:break;
}
}
当我在 Launchpad 上运行此代码时、我会同时从 P6.0和 P6.1获得响应。 我的测试用例非常原始-我只是将引脚跳至 GND 或3V3。
您连接到这些引脚的是什么?
您好、Bruce、
谢谢、问题出在我这边、我的引脚6.0不工作。 感谢您的参与、祝您假期愉快。