工具/软件:Code Composer Studio
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.
工具/软件:Code Composer Studio
您好,Andrew,
dev.ti.com/tirex上提供了F5438A的代码示例。 此处显示了一个概述如何使用TB0生成PWM 的示例。 为了生成1kHz的PWM信号,您需要将 TBCCR0 =(TBCLK/1kHz)-1更改为 TBCCR0 0.6 的所需百分比,并将TB 0.3 -TB的相应TBCCRx更改为所需的-TB。
MSP-EXP430F5438实验板用户指南 也是如何与LCD屏幕交互的一个很好的资源。
此致,
Ryan
尊敬的Ryan:
感谢您的快速回复。 但还有一些我不完全理解的事情。 顺便说一句,如果我的问题很小的话,很抱歉,但这是我为任何微控制器编写的第一个程序。 所以,请帮我一点。
TB0CCR0中的值定义PWM周期。 在我的情况下,它应该是1000Hz。 我应该将所需频率转换为什么单位? 我应该以Hz,kHz或毫秒为单位写入? 另外,在TB0CCR3中,我应该写下占空比。 这里有什么装置? 它应该是一个介于0和100之间的数字,代表百分比? 还是其他?
我的终极任务是在其中一个引脚上生成正弦信号,使用矩形波作为基本信号。 这意味着我必须始终更改PWM占空比。 我已确定公式:
DutyCycle =[1/2+1/2*sin (2*pi*f*t)]* 100 %
其中f是1到16之间的数字。
我的问题是,我应该在计划的哪个位置更改TB0CCR3 (占空比)中写入的值,我应该多久更改一次?
下面是我写过的内容。 您认为还可以吗?
非常感谢。
Andrew
#include <MSP4S.h>
双倍f //频率
//min f = 1 Hz
//最大f = 16 Hz
/**
*@简明主功能
*写评论
*
*/
内部主(无效)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
//初始化按钮
// WFP 2.4 =向上按钮
P2DIR &=~BIT4; // WFP 2.4 作为输入(按钮)
P2IES |= BIT4; //下降边缘
P2IFG &=~BIT4; //清除IFG (标志寄存器)
P2IE |= BIT4; //启用中断
//初始化按钮
// WFP 2.5 =向下按钮
P2DIR &=~BIT5; // WFP 2.5 作为输入(按钮)
P2IES |= BIT5; //下降边缘
P2IFG &=~BIT5; //清除IFG (标志寄存器)
P2IE |= BIT5; //启用中断
//初始化PWM计时器
P4DIR || BIT3; // WFP 4.3 输出(二极管)
P4SEL |= BIT3; // WFP 4.3 用于TB
TB0CCTL3 = OUTMOD_7; //重置/设置输出模式
TB0CCR0 = 15; ??? //期间
TB0CCR3 = 7; ??? //初始脉冲宽度值
TB0CTL = TBSSEL__ACLK | MC__UP;
F = 5; //初始频率
__enable_interrupit();
同时(1);
}
/**
*@简要端口2 ISR
*
*在检测到的按钮上,按下(加号按钮),增加频率f
*/
void __attribute__((interrupt (port2_vector))) P2ISR (void)
{
__DELAY周期(1000);
如果((P2IFG & BIT4)!=0){// 检查是否设置了WFP 2.4 标志
如果((P2IN & BIT4)=0){// 检查是否仍按下了WFP 2.4
如果(f & 0x0F)!= 0x0F){
f = f + 1; //按下按钮且f小于16时,增加频率
}
}
P2IFG &=~BIT4;
}
}
/**
*@简要端口2 ISR
*
*在检测到的按钮上,按下(减号按钮)将频率降低f
*/
void __attribute__((interrupt (port2_vector))) P2ISR (void)
{
__DELAY周期(1000);
如果((P2IFG & BIT5)!=0){// 检查是否设置了WFP 2.5 标志
如果((P2IN & BIT5)=0){// 检查是否仍按下了WFP 2.5
如果(f & 0x0F)!= 0x01){
f = f - 1; //按下按钮且f大于1时,降低频率
}
}
P2IFG &=~BIT5;
}
}
您好,Andrew,
TB0CCR0的单位是计时器周期中的时钟周期数,因此您需要知道计时器时钟源的频率(TBCLK)以及它生成的PWM的频率(1 kHz)来计算其值。 现在,您可以根据以下代码行从ACLK计时:
TB0CTL = TBSSEL__ACLK | MC__UP;
您可能需要将TBSSEL__ACLK更改为默认值为1 MHz的TBSSEL_SMCLK,以便时钟源变为TBCLK = SMCLK =1 MHz。
然后按如下方式计算TB0CCR0的值:
TB0CCR0 =[TBCLK /(PWM频率)]- 1 =(1 MHz / 1 kHz)- 1 = 1000 - 1
1源于计时器从0开始计数,而不是从1开始计数。 然后,TB0CCR3应通过每个周期的时钟周期数乘以占空比百分比(四舍五入为最接近的整数)进行设置。 因此,50 % 占空比将是:
TB0CCR3 =[1000* 50 % ]- 1= 500 - 1.
现在,PWM周期已设置,但更新占空比会怎样? 结果发现,每个工作周期开始时都会触发一个方便的计时器中断,为更新其值提供了完美的位置。 只需启用中断并添加计时器中断ISR。
TB0CTL |= TBIE; //启用计时器中断
//计时器B0中断服务例程 #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__) #pragma vector=TIMERB1_vector __interrupt void TIMERB1_ISR(void) #Elif defined(__GNUC__) void __attribute__(interrupt (TIMERB1_void_use)((vector) 编译器#void) #endif { TB0CCR3 =//1000*%占空比-1; }
另外几个注释,您可以将按钮按中断组合到同一功能中。 此外,您用于查找占空比的公式是准确的,但执行该计算在计算上成本高昂,而且可能太慢。 您可能希望先计算正弦波的PWM占空比值,然后将其存储在执行代码时要查找的数组中。 但这要由您决定如何实施。
此致,
Ryan
#include <MSP4S.h>
unsigned char f; //频率
//min f = 1 Hz
//max f = 16 Hz
/**
*@简要主功能
*写入注释
*
**/
int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
//初始化按钮
// WFP 2.4 =向上按钮
P2DIR &=~BIT4;// WFP 2.4 作为输入(按钮)
P2IES |= BIT4;//下降边缘
P2IFG &=~BIT4;//清除IFG (标志寄存器)
P2IE |= BIT4;//启用中断
//初始化按钮
// WFP 2.5 =向下按钮
P2DIR &=~BIT5;// WFP 2.5 作为输入(按钮)
P2IES |= BIT5;//下降边缘
P2IFG &=~BIT5;//清除IFG (标志寄存器)
P2IE |= BIT5;//启用中断
//初始化PWM计时器
P4DIR || BIT3;// WFP 4.3 输出(二极管)
P4SEL |= BIT3;// WFP 4.3 用于TB
TB0CCTL3 = OUTMOD_7;//重置/设置输出模式
TB0CTL = TBSSEL__SMCLK | MC__UP;//使用TBCLK = SMCLK =1 MHz到时钟计时器
TB0CCR0 = 1000 - 1;//=[TBCLK /(PWM频率)]- 1 =(1 MHz / 1 kHz)- 1 = 1000 - 1
TB0CCR3 = 500 - 1; // 50 % 占空比
TB0CTL |= TBIE; //启用计时器中断
f = 5; //初始频率
__enable_interrupit();
while (1);
}/**
*@brief port2 ISR
**
在检测到时按(加号按钮)增量频率f
*/
void __attribute__((interrupt (port2_vector)) P2ISR (void)
{
__delay_cycles(1000);
如果((P2IFG & BIT4)!=0){//检查是否设置了WFP 2.4 标志
,如果((P2IN & BIT4)==0){//检查是否仍按了WFP 2.4
,如果((f & 0x0F)!= 0x0F){
f = f + 1;//当按下按钮且f小于16时,增量频率
}
P2IFG
&=~BIT4;
}
如果((P2IFG & BIT5)!=0){//检查是否设置了WFP 2.5 标志
,如果((P2IN & BIT5)==0){//检查是否仍按了WFP 2.5
,如果(f & 0x0F)!= 0x01){
f = f -1;//当按下按钮且f大于1时,降低频率
}
P2IFG
&=~BIT5;
}
}//
计时器B0中断服务例程
#if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
#pragma vector=TIMERB1_vector
__interrupt void TIMER_ISR(void)
#Elif defined(__GMNU__)
__attribute__(interrupt (TIMERB1_void_error)
缂栬疟鍣?b1)
#endif
{
TB0CCR3 =//1000*%占空比-1;
}