我正在尝试执行以下操作:
每次从定时器 B CCR1触发时、对9个通道进行采样并停止、在最后一次转换时使用单个中断来收集数据。
我希望这可以自动运行、而无需手动切换任何位。 这是可行的吗?
我初始化如下内容:
//定时器 B:400Hz 和 A/D 触发器
P3DIR |= BIT6; // P3.6输出引脚43 400Hz
P3SEL |= BIT6; // P3.6选项选择(TB0.6)
//ccr0设置周期
TBCCR0 = 29999; // 400Hz @24MHz (半周期、切换)
//ccr1触发 A/D
TBCCR1 = 5; //只需一个窄脉冲即可触发
TBCCTL1 = OUTMOD_7; // CCR1复位/设置模式 A/D 触发
P5DIR |= BIT7;P5SEL |= BIT7; //(调试)输出引脚56 (Disp 引脚6)
//ccr6生成400Hz 输出
TBCCTL6 = OUTMOD_4; //切换,用于400Hz 输出的引脚43
TBCCR6 = 3000; //相位偏移(在正弦波峰值处采样)
TBCTL = TBSSEL_2 + MC_1; // SMCLK、upmode
//ADC12 (tudi za potenciometer)
ADC12CTL0 = ADC12ON; // ADC12打开
ADC12CTL0 &=~ADC12ENC;
while (ADC12CTL1和 ADC12BUSY);
P6SEL |= BIT4+BIT5+BIT6+BIT7; // P6 ADC 选项选择
P7SEL |= BIT0+BIT1 + BIT2 + BIT3; // P7 ADC 选项选择
P5SEL |= BIT0+BIT1; // P7 ADC 选项选择(封装)
ADC12CTL0 |= ADC12SHT00 + ADC12SHT10;//采样时间、chans 0...7 & 8...15
ADC12CTL0 |= ADC12MSC;
ADC12MCTL0 = ADC12INCH_4; // ref=Vcc、VSS、通道4
ADC12MCTL1 = ADC12INCH_5; // ref=Vcc、VSS、通道5
ADC12MCTL2 = ADC12INCH_6; // ref=Vcc、VSS、通道6
ADC12MCTL3 = ADC12INCH_7; // ref=Vcc、VSS、通道7
ADC12MCTL4 = ADC12INCH_12; // ref=Vcc、VSS、CHAN 12.
ADC12MCTL5 = ADC12INCH_13; // ref=Vcc、VSS、通道13
ADC12MCTL6 = ADC12INCH_14; // ref=Vcc、VSS、CHAN 14
ADC12MCTL7 = ADC12INCH_15; // ref=Vcc、VSS、通道15
ADC12MCTL8 = ADC12INCH_8; // ref=Vcc、VSS、通道8 (密封)
ADC12MCTL9 = ADC12INCH_9 + ADC12EOS; // ref=Vcc、VSS、CHAN 9 (灌电流)、序列结束
ADC12CTL1 = ADC12SHS_3; // trig =定时器 B CCR1
ADC12CTL1 |= ADC12SHP; //脉冲模式采样
ADC12CTL1 |= ADC12CSTARTADD_0; //起始地址
ADC12CTL1 |= ADC12CONSEQ_3; //重复应答序列
//ADC12CTL1 |= ADC12CONSEQ_1; //应答序列(切换 ADC12ENC!)
ADC12CTL2 |= ADC12RES_2; // 12位分辨率
ADC12IE = ADC12IE9; //在最后一次转换时启用中断
ADC12CTL0 |= ADC12ENC; //启用转换(必须是最后一次)
现在、中断只会切换引脚、因此我可以看到发生了:
#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)
{
开关(ADC12IV)
{
情况0:中断; //向量0:无中断
情况2:中断; //矢量2:ADC 溢出
情况4:中断; //矢量4:ADC 时序溢出
情况6:中断; //向量6:ADC12IFG0
情况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
情况36:中断; //向量36:ADC12IFG15
默认值:break;
}
int a=ADC12MEM9;
P1OUT ^= 0x01; //切换 P1.0 (调试)
}
问题是、如果我将 MSC 位置位、ADC 会持续采样、忽略 EOS 位、不等待触发信号。
如果我不设置 MSC 位、ADC 只转换计时器每次触发的一个输入、以便 ADC 中断仅在9个触发后触发。