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/MSP430G2553:如何查找1kHz的PWM频率

Guru**** 2589275 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/629396/ccs-msp430g2553-how-to-find-pwm-frequency-of-1khz

部件号:MSP430G2553

工具/软件:Code Composer Studio

是否有人知道如何找到TA0CCR0的值,该值将为我提供1kHz的PWM频率? 现在是10kHz,但我有点困惑如何获得 TA0CCR0的值

#include "msp430G2553.h"
#include <stdint.h>

void main( void )
{
WDTCTL =(WDTPW | WDTHOLD);//停止看门狗计时器

BCSCTL1 = CALC1_8MHZ;//将范围设置为8MHz
DCOCTL = CALDCO_8MHZ;//设置DCO步进调制,

0x40 MHz //将WFP 2.6 的特殊功能设置为定时器模块
P2DIR = 0x40;//将WFP 2.6 设置为输出方向


TA0CCR0 =(800 - 1);//频率10kHz
TA0CCR1 = 400;//占空比50 %
TA0CCTL1 = OUTMOD_7; //重置/设置
TA0CTL =(tassel_2 | ID_0 | MC_1 | TCLR | TAIE);// SMCLK,分隔器1,上模式,清除, 中断已启用

_BIS_SR( GIE );//启用全局中断

同时(1);//无限循环
}//

Timer0 A1中断服务例程
#pragma vector = TIMER0_A1_Vector
__interrupt void Timer0_A1_ISR( void ){

静态uint16_t计数器=0;//循环计数
器静态uint8_t方向=1,0;// 向下

TA0CTL &=~TAIFG;//清除中断标志

IF(++counter >= 9万 // 9s
{
IF (方向)//方向为向上
{
TA0CCR1 +=40;//将5 % 添加到现有值中

IF (TA0CCR1 == 400)//达到50 % 占空比
{
方向= 0;//下一次时间下移
}
}
Else //方向向下
{
TA0CCR1 -=40;//从现有值减去5 %

IF (TA0CCR1 == 40)//达到5 % 占空比
{
方向= 1;//下一次进入
}
}
计数器= 0;//重置计数
器}

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

    您好,

    查看代码的第18行,计时器A 设置为使用SMCLK作为时钟源,分频器为1。 计时器也被设置为上行模式,使其从0计数到存储在 TA0CCR0中的值,然后进入其中断例程 Timer0_A1_ISR,然后从0重新开始计数。 PWM频率与中断频率相匹配。

    TA0CTL =(tassel_2 | ID_0 | MC_1 | TCLR | TAIE);// SMCLK,分配器1,上模式,清除, 中断已启用 

    由于SMCLK在行8和行9中设置为8 MHz的频率,定时器A将以8 MHz的频率进行计数。

    BCSCTL1 = CALC1_8MHZ;//将范围设置为8MHz
    DCOCTL = CALDCO_8MHZ;//将DCO步进和调制设置为8MHz 

    因此,要将PWM频率设置为1 kHz,您必须计算定时器A的计数值,以便将定时器中断设置为正确的频率。 这由以下等式提供:

    TA0CCR0 =计时器频率(8 MHz)/中断频率(1 kHz)- 1 = 8000 - 1

    -1是因为计时器实际上从0开始计数,而不是从1开始计数。

    根据您的应用,您可能还需要更改涉及计数器和TA0CCR1的代码行,因为 Timer0_A1_ISR现在以1 kHz而不是10 kHz的频率运行,这将改变计数器计时和PWM百分比。

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你
    那么我如何找到counter和TA0CCR1的值
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您希望PWM百分比保持不变,则必须将TA0CCR1的每个实例增加10倍,因为计时器A的数值必须增加10倍。

    例如,

    TA0CCR1 = 4000;//占空比50 % 
    TA0CCR1 +=400;//将5 % 添加到现有值中 

    以及其他的。

    另一种思考方式是 由TA0CCR1设置的PWM频率由TA0CCR1给出=计时器计数值* PWM %。

    因此,50 % PWM将由TA0CCR1 =8000* 50 % =4000设置。

    至于计数器值,以前涉及计数器的代码行为

    IF (+++counter >= 9万)// 9s 

    9万来自中断频率乘以计数器计数到的时间。

    由于中断频率现在为1kHz,因此代码行现在应该为1kHz

    IF(++counter >= 9000)/9秒 

    此致,

    Ryan