Howdy、
我正在与 MSP430FR5969合作、尝试使内部 ADC 正常工作。 我将复制中的代码、但我将引导您完成我的思考过程。
我希望采样频率约为100kHz。 采样保持设置为16个周期时、我将 DCO 设置为4MHz、并使用 TA0.1运行双位 PWM、从而提供2MHz 的 PWM (2MHz/16个周期采样保持= 125kHz)。 当我调试代码时、它将采集大约30-100个样本(看起来正确)、然后在之后停止采样(它卡在"while (!(!(ADC12IFGR0 & BIT0));")、此时它应该采集701个样本、然后复位回0。 它在破坏我的大脑!
#include void gpioinit(); void clockinit(); void timerinit(); void timertest(); void adcinit(); unsigned int index; int results[700]; int main (void){ WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 索引= 0; gpioinit(); clockinit(); timerinit(); timertest(); adcinit(); while (1){ ADC12CTL0 |= ADC12SC; while (!(ADC12IFGR0 & BIT0)); 结果[索引]= ADC12MEM0; //读取转换结果 索引=索引+ 1; if (索引=699) 索引= 0; } } void gpioinit (void){ P1SEL1 |= BIT2; //配置 ADC 输入 A2 P1SEL0 |= BIT2; } void clockinit (void){ //时钟系统设置-使用 msp430fr5969.h 查找定义 CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器 CSCTL1 = DCOFSEL_3; // DCO = 4MHz CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO // ACLK = VLOCLK CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将所有分频器设置为1 CSCTL0_H = 0; //锁定 CS 寄存器 } void timerinit (void){ //禁用 GPIO 上电默认高阻抗模式以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; //使用 TimerA0.1以100kHz 的频率定期触发 ADC TA0CCR0 = 1; //频率= 4MHz/(TA0CCR0+1)= 2MHz TA0CCR1 = 1; //占空比 Ton =(TA0CCR1 + 1)/4MHz TA0CCTL1 = OUTMOD_7; //设置/复位模式 TA0CTL = tassel__SMCLK | MC__UP | TACLR;// SMCLK,向上计数模式,清除 TAR } void adcinit(){ //查看表5-23中的时序参数 //配置 ADC12 ADC12CTL0 &=~ADC12ENC; //禁用 ADC12 ADC12CTL0 &=~ADC12ON; ADC12CTL0 = ADC12SHT0_2; //配置16个 ADCCLK 周期的采样和保持时间 ADC12CTL1 = ADC12SH_1 | ADC12SHP | ADC12CONSEQ_2; // ADCCLK = MODOSC;采样计时器、从 TA0.1 (SHS_1)触发、重复单通道 ADC12CTL2 = ADC12RES_2; // 12位转换结果 ADC12MCTL0 |= ADC12INCH_2 | ADC12DIF; //通道2 ADC 输入选择;Vref=AVCC ADC12CTL0 |= ADC12ON; ADC12CTL0 |= ADC12ENC; } void timertest (void){ //使用 TimerB0.1以100kHz 的频率定期触发 ADC TB0CCR0 = 1; //频率= 1MHz/(TA0CCR0+1)= 2MHz TB0CCR1 = 1; //占空比 Ton =(TB0CCR1 + 1)/2MMHz TB0CCTL1 = OUTMOD_7; //设置/复位模式 TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR P1DIR |= BIT4; //P1.4输出 P1SEL0 |= BIT4; //P1.4至 TB0.1 }
