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/MSP430FR5969:控制 PWM 占空比、使其与调节电路的 ADC 值发生变化

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/681818/ccs-msp430fr5969-contorlling-pwm-dutycycle-with-varying-adc-value-from-scaling-circuit

器件型号:MSP430FR5969

工具/软件: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;//保存测量值。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如编码所示、这会在转换过程中持续停止和重新启动 ADC (另请参见 SLAU367O 的34.2.8.6秒)。 (虽然我不知道您会从时钟系统中得到什么效果、但它也会不断地重新配置时钟系统。)

    我建议您将 configureADC (和 makepwm)调用移出 while (1)循环、然后更改 updatedutycycle 以根据需要设置 TA1CCR1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你:)将尝试这一方法并让你知道结果。 感谢您的回复。

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

    您好,

    我想您可以参考 TI 官方示例代码以获得帮助。 您可以在 CCS 中找到所需的内容(View -> Resource Explorer)。

    此致、

    如果我的帖子有助于解决您的问题、请单击  验证答案    按钮 

    冬季、

    搜索 E2E! 您的问题可能已经得到解答!  

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

    如果您没有更多反馈、我将关闭此主题。 您可以稍后在这些回复下方继续提问。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这解决了我的问题

    #include
    #include
    /********* 累加和缩放 ADC 输出******** /
    unsigned int NUM_OF_Results=8; //要采集的样本数
    unsigned int scale_faction=3; //用于平均转换的样本
    unsigned int ADC12_Ratio= 0.61035;// 2500/4096 (2.5V 基准和12位转换器)
    / /
    //全局变量声明
    signed int BREF=554、PWMAX=20、PWMIN=480;
    unsigned int Dutycycle;
    浮点 ADCValue;
    //全局函数声明
    void CongifureAdc();
    void measure();
    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%占空比
    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 = 16MHz
    CSCTL2=SELA_VLOCLK|SEL__DCOCLK|SELM_DCOCLK;//设置 ACLK=VLO SMCLK=DCO
    CSCTL3=DIVA_1_|DIVS_1|DIVM__1; //设置所有分频器
    CSCTL0_H=0; //锁定 CS 寄存器


    while (1)

    make_PWM (占空比);
    _delay_cycles (5000);
    CongifureAdc();
    _ENABLE_INTERRUPT ();//启用中断。
    _delay_cycles (500);
    措施();

    UpdateDutycycle (ADCValue);

    _bis_SR_register (LPM0_bits);
    __no_operation();
    返回0;

    //说明:生成所需占空比的 PWM
    /*------------------ *
    void make_PWM (无符号 int 占空比)


    //配置 Timer1_A
    TA1CCR0=512-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


    //说明:ADC12模块的初始化
    /*------------------ *
    void CongifureAdc()

    //清除 ADC 标志
    ADC12IFGR0 = 0x00;
    ADC12IFGR1 = 0x00;
    ADC12IFGR2 = 0x00;
    ////// 配置 ADC////
    ADC12CTL0&=~ADC12ENC; //在初始化期间禁用 ADC12
    ADC12CTL0|=ADC12SHT0_8|ADC12ON|ADC12MSC;//打开 ADC12、设置采样时间、启用中断
    ADC12CTL1|=ADC12SHP|ADC12CONSEQ_2; //使用采样计时器、重复单通道转换
    ADC12CTL2|=ADC12RES_2; // 12位转换结果
    ADC12MCTL0|=ADC12INCH_3|ADC12VRSEL_3;// ref+=AVcc、channel = A3 Vref = 2.5V // ref-1.2V、2.0V、2.5V
    ADC12IER0 |= ADC12IE0; //启用 ADC 转换完成中断


    //说明:开始转换 ADC12模块
    /*------------------ *
    void measure()

    ADC12CTL0 |= ADC12ENC; //启用转换
    ADC12CTL0 |= ADC12SC; //开始转换
    _DELAY_CYCLES (75);
    _bis_SR_register (CPUOFF + GIE);//启用中断的 LPM0


    //说明:计算适当的占空比
    /*------------------ *
    void UpdateDutycycle (unsigned int ADCValue)

    if (ADCValue<2862)

    占空比=TA1CCR1+;

    if (ADCValue>4006)

    占空比=TA1CCR1---;



    /*------------------ *
    //描述:
    // ADC12中断服务例程
    /*------------------ *
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector = ADC12_vector
    _interrupt void ADC12_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (ADC12_vector)) ADC12_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    静态 uint8_t 索引= 0;
    volatile uint16_t results[NUM_OF_Results]; //以存储 ADC 输出
    静态 uint32_t sum_adc_data = 0; //累加和平均 ADC 分辨率
    switch (__evo_in_range (ADC12IV、ADC12IV_ADC12RDYIFG))

    ADC12IV_NONE 案例: 中断; //向量0:无中断
    案例 ADC12IV_ADC12OVIFG:中断; //向量2:ADC12MEMx 溢出
    ADC12IV_ADC12TOVIFG 案例:中断; //向量4:转换时间溢出
    案例 ADC12IV_ADC12HIIFG:break; //向量6:ADC12BHI
    ADC12IV_ADC12LOIFG 案例:中断; //向量8:ADC12BLO
    ADC12IV_ADC12INIFG 案例:中断; //向量10:ADC12BIN
    ADC12IV_ADC12IFG0案例: //向量12:ADC12MEM0中断
    //轮询忙位等待转换完成
    while (ADC12CTL1 & ADC12BUSY){
    __no_operation(); //也可以将循环保留为空

    结果[索引]= ADC12MEM0; //移动结果
    SUM_ADC_DATA += ADC12MEM0;
    索引++; //使结果索引递增,取模;

    if (索引=NUM_OF_Results)

    sum_adc_data >= scale_factor; //除以 NUM_OF_Results
    ADCValue = SUM_ADC_DATA * ADC12_Ratio; //累加的 ADCValue
    SUM_ADC_DATA = 0; //在此处设置断点并查看测量的 ADCValue
    索引= 0;

    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//返回活动模式
    _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出活动 CPU
    中断;
    ADC12IV_ADC12IFG1案例:中断; //向量14:ADC12MEM1
    ADC12IV_ADC12IFG2案例:中断; //向量16:ADC12MEM2
    ADC12IV_ADC12IFG3案例:中断; //向量18:ADC12MEM3
    ADC12IV_ADC12IFG4案例:中断; //向量20:ADC12MEM4
    ADC12IV_ADC12IFG5案例:中断; //向量22:ADC12MEM5
    ADC12IV_ADC12IFG6案例:中断; //向量24:ADC12MEM6
    ADC12IV_ADC12IFG7案例:中断; //向量26:ADC12MEM7
    ADC12IV_ADC12IFG8案例:中断; //向量28:ADC12MEM8
    ADC12IV_ADC12IFG9案例:中断; //向量30:ADC12MEM9
    ADC12IV_ADC12IFG10案例:中断; //向量32:ADC12MEM10
    ADC12IV_ADC12IFG11案例:中断; //向量34:ADC12MEM11
    ADC12IV_ADC12IFG12案例:中断; //向量36:ADC12MEM12
    ADC12IV_ADC12IFG13案例:中断; //向量38:ADC12MEM13
    ADC12IV_ADC12IFG14案例:中断; //向量40:ADC12MEM14
    ADC12IV_ADC12IFG15案例:中断; //向量42:ADC12MEM15
    ADC12IV_ADC12IFG16案例:中断; //向量44:ADC12MEM16
    ADC12IV_ADC12IFG17案例:中断; //向量46:ADC12MEM17
    ADC12IV_ADC12IFG18案例:中断; //向量48:ADC12MEM18
    ADC12IV_ADC12IFG19案例:中断; //向量50:ADC12MEM19
    ADC12IV_ADC12IFG20案例:中断; //向量52:ADC12MEMM20
    ADC12IV_ADC12IFG21案例:中断; //向量54:ADC12MEM21
    ADC12IV_ADC12IFG22案例:中断; //向量56:ADC12MEM22
    ADC12IV_ADC12IFG23案例:中断; //向量58:ADC12MEM3
    ADC12IV_ADC12IFG24案例:中断; //向量60:ADC12MEM24
    ADC12IV_ADC12IFG25案例:中断; //向量62:ADC12MEM25
    ADC12IV_ADC12IFG26案例:中断; //向量64:ADC12MEM26
    ADC12IV_ADC12IFG27案例:中断; //向量66:ADC12MEM27
    ADC12IV_ADC12IFG28案例:中断; //向量68:ADC12MEM28
    ADC12IV_ADC12IFG29案例:中断; //向量70:ADC12MEM29
    ADC12IV_ADC12IFG30案例:中断; //向量72:ADC12MEM30
    ADC12IV_ADC12IFG31案例:中断; //向量74:ADC12MEM31
    案例 ADC12IV_ADC12RDYIFG:break; //向量76:ADC12RDY
    默认值:break;