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.

[参考译文] CCS/MSP430F6638:不#39;t 具有适用于 MSP430F6638 ADC 的正确采样频率

Guru**** 2384830 points
Other Parts Discussed in Thread: MSP430F6638
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/879175/ccs-msp430f6638-don-t-have-the-right-sampling-freqency-for-the-msp430f6638-adc

器件型号:MSP430F6638

工具/软件:Code Composer Studio

您好!

我正在使用 msp430f6638的 ADC12。 我需要100Hz 的采样频率。 那么、通过计时器、我创建了该信号。 然后、我选择了计时器作为 ADC12采样保持的源。 ADC 的时钟源是 SMCLK、该时钟源来自连接到8MHz 晶体的 XT2。 因此、我编写了一个包含所有这些配置的代码、并且在计时器输出上、我得到了预期的100Hz 信号。 然后、我想通过在输入端输入一个3Hz 正弦波来测试 ADC。 我想查看 ADC 是否能够重建输入正弦波、因此我创建了一个长度为1000的制表符来存储转换后的值。 然后、使用 CCS A 上的图形功能、将信号环路、结果是一条线、 这是因为我们采样的点数比预期的要多得多、并且这些值之间的距离非常近、并且值会逐位减小(2700、2699、2698等)、这对应于正弦波、但采样的点数过大。 我的意思是、采样频率似乎不是100Hz、但比我不理解的频率高得多、因为我在计时器输出上有100Hz 的频率。 我尝试通过创建变量"h"并写入仅当 h 大于200时才包含转换值的制表符来找到解决方案、例如、这意味着我们每写入制表符200次。 使用此解决方案、我能够正确地绘制波正弦(我可以看到多个周期)、但这不是正确的方法、因此我需要 ADC 以100Hz 频率进行采样。 以下是我的代码:

int i = 0;
int h =0;

int 选项卡[1000];

int main (空)

ADC12Init();

ADC12_sample_clk ();

_BIS_SR (GIE);

while (1)

if (write_mem=1 && i<1000)

write_mem=0;
ADC_Value =转换后的值;
如果(h>200)

TAB[I]=ADC_Value;
i++;
H = 0;

其他


H++;

#pragma vector = ADC12_vector
_interrupt void ADC12_ISR (void)

conved_value = ADC12MEM0和0x0FFF;//以便仅保持低12位
ADC12IFG &=~ADC12IFG0;
write_mem = 1;

空 ADC12初始化(空)

P6SEL|=BIT5;                                                                                 //选择 P6.5作为 ADC 而不是 I/O
ADC12CTL0 &=~ADC12ENC;                                                                    // ADC12被禁用
REFCTL0 &=~REFMSTR;                                                                           //复位 REFMSTR 以将控制权交给 ADC12_A 基准控制寄存器
ADC12CTL0 = ADC12ON + ADC12REFON + ADC12REF2_5V + ADC12SHT0_1 + ADC12MSC;                 //采样时间8、大约8/2MHz = 4us (好的、因为请参阅 P43数据表)、r é frence 2.5V、r é frence on et ADC12 on
ADC12CTL1 = ADC12SHP + ADC12SH_1 + ADC12DIV_3 + ADC12CONSEQ_2 + ADC12SSEL_3;             //启用采样计时器、来自 SMCLK 的 ADC 时钟、触发源1计时器和 CONSEQ=2  
ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_5;                                                      //选择参考和 A5面板
ADC12IE|= ADC12IE0;                                                                    //为 ADC 启用中断
ADC12CTL0|=ADC12ENC;                                                                 //启用转换

#define ADC_SAMPLE_PERIOD 327
#define ADC_SAMPLE_DC 163

void ADC12_sample_clk (void)

P1SEL|=BIT1;                               //选择 P1.1作为 TA0而不是 I/O
P1DIR|=BIT1;
P1SEL|=BIT2;                                //选择 P1.2作为 TA0输出而不是 I/O
P1DIR|=BIT2;
TA0CCR0 = ADC_SAMPLE_PERIOD - 1;       // 100Hz 采样频率
TA0CCTL1|= OUTMOD_6;                  //输出模式2
TA0CCR1 = ADC_SAMPLE_DC;             //占空比不重要是周期,而是周期
TA1R = ADC_SAMPLE_PERIOD - 2;
TA0CTL = tassel_1 + TACLR + MC_1;       // ACLK、向上计数模式

因此、使用这里的代码是我在 ADC 输入端输入3Hz 正弦波时获得的信号:

在每个峰值之间有140个点。 假设我们仅在 h>200时才编写选项卡、实际情况下、140*200 = 28'000点、两个峰值之间的频率为3Hz 正弦、这意味着它为28'000*3 = 84'000点/秒、这可提供84kHz 信号、而不是100Hz。 我真的不知道我犯了什么错误。 我的意思是、我确实需要以100Hz 而不是84kHz 或更高的频率进行采样。 我不知道这是怎么可能的、因为我认为我已经很好地配置了 ADC。 请提供任何帮助。

非常感谢、

此致、  

Mike

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >ADC12CTL0 = ADC12ON + ADC12REFON + ADC12REF2_5V + ADC12SHT0_1 + ADC12MSC;  
    >ADC12CTL1 = ADC12SHP + ADC12SH_1 + ADC12DIV_3 + ADC12CONSEQ_2 + ADC12SSEL_3;

    如果 CONSEQ=2、MSC=1、ADC 将忽略您的计时器触发器并以最快的速度运行。 删除 ADC12MSC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    非常感谢你的帮助。 它现在可以工作了!

    此致、

    Mike