工具/软件:Code Composer Studio
我们使用 MSP30fr5969设计了一个闭环电路、当降压转换器上的负载发生变化时、调节电压会发生变化、从而改变 ADC 值我们比较 该值以增加占空 比、从而 使输出保持在5-7V 之间。 在更新占空 比功能时会检查这些条件。
面临的问题是 ADC 内存 (ADCMEM0)有时会更新为垃圾值、有时会保持为00。 有时、对于不变的负载、它会不断变化。 有人能帮我吗?
以下是 AM 代码的工作情况。
#include
unsigned int ADCValue、Dutycycle;
void CongifureAdc (void);
void Configuretimer (void);
void make_PWM (unsigned int Dutycycle);
void UpdateDutycycle (unsigned int ADCValue);
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
P1SEL0|=BIT3;//为 ADC 配置 P1.3
P1SEL1|=BIT3;
PM5CTL0=~LOCKLPM5;
占空比= 256;最初为//50%占空比
while (1)
{
make_PWM (占空比);
ConfigureADC();
UpdateDutycycle (ADCValue);
}
_bis_SR_register (LPM0_bits);
__no_operation();
返回0;
}
空 ConfigureADC()
{
//清除 ADC 标志
ADC12IFGR0 = 0x00;
ADC12IFGR1 = 0x00;
ADC12IFGR2 = 0x00;
ADC12CTL0&=~ADC12ENC;//在初始化期间禁用 ADC12
ADC12CTL0|=ADC12SHT0_2|ADC12ON;//打开 ADC12、设置采样时间、启用中断
ADC12CTL1|=ADC12SHP|ADC12CONSEQ_2;//使用采样计时器,设置模式双序列
ADC12CTL2|=ADC12RES_2;// 12位转换结果
ADC12IER0 |= ADC12IE0;//中断 MEM0
ADC12MCTL0|=ADC12INCH_3|ADC12VRSEL_3;// ref+=AVcc、channel = A3 Vref = 2.5V // ref-1.2V、2.0V、2.5V
ADC12CTL0|=ADC12ENC|ADC12SC;//启用 ADC 并开始转换、采样
}
void make_PWM (无符号 int 占空比)
{
P1DIR|=BIT2;//P1.2输入
P1SEL0|=BIT2;//P1.2选择
PM5CTL0=~LOCKLPM5;
FRCTL0=FRCTLPW|NWAITS_1;//配置16M MCLK
CSCTL0_H=CSKEY>8;//解锁 CS 寄存器''''''''''''''''''
CSCTL1=DCORSEL|DCOFSEL_4;//设置 DCO = 8MHz
CSCTL2=SELA_VLOCLK|SEL__DCOCLK|SELM_DCOCLK;//设置 ACLK=VLO SMCLK=DCO
CSCTL3=DIVA__1|DIVS_1|DIVM_1;//设置所有分频器
CSCTL0_H=0;//锁定 CS 寄存器
//配置 Timer1_A
TA1CCR0=52-1;// PWM 周期
TA1CCTL1=OUTMOD_7;// CCR2复位/置位
TA1CCR1=Dutycycle;// CCR1 PWM 占空比
//| P1.2/TA1|--> CCR1 - 383->75% PWM
//| P1.2/TA1|->CCR1 - 256->50% PWM
//| P1.2/TA1|->CCR1 - 128->25% PWM
//| P1.2/TA1|->CCR1 - 64->12.5% PWM
//| P1.2/TA1|--> CCR1 - 32->6.26% PWM
//| P1.2/TA1|->CCR1 - 16->3.13% PWM
//| P1.2/TA1|--> CCR1 - 8->1.56% PWM
TA1CTL=tassel_SMCLK|MC_UP|TACLR;// SMCLK、向上计数模式、清除 TAR
}
void UpdateDutycycle (unsigned int ADCValue)
{
if (ADCValue<2862)
{
占空比=TA1CCR1+;
}
if (ADCValue>4006)
{
占空比=TA1CCR1---;
}
}
#pragma vector=ADC12_vector
_interrupt void ADC12_ISR (void)
{
ADCValue = ADC12MEM0;//保存测量值。
}
