MSP430F5529LP一个定时器多路输出不同频率不同占空比PWM

MSP430F5529LP一个定时器多路输出不同频率不同占空比PWM

这个在用32的时候就搞过这个,现在稍微搞下msp430,把以前弄过的东西移植一下。
在32时,定时器每次计数到CCR时让电平翻转一次,同时改变CCR值,新的值是在原来的基础上加上设置值
参考一下官方文档。
在这里插入图片描述

连续模式可以用来产生独立的时间间隔和输出频率。每完成一个间隔,就会产生一个中断。下一个时间间隔被添加到中断服务例程中的TAxCCRn寄存器中。图17-6分别以t0和t1为例进行说明
,被添加到捕获/比较寄存器中。在这种情况下,时间间隔由硬件控制,而不是软件,不受中断延迟的影响。在n (n = 0到6)范围内,可以使用捕获/比较寄存器生成独立的时间间隔或输出频率

选用连续计数模式可以保证CCRn的寄存器值与计数长度等同,这样就可以无视CCRn寄存器值溢出导致的变化。

在确认了时基部分后,看一下输出模式。

输出

在连续计数模式下。Mode4时,每计数到CCRn值,对应n通道的电平就会发生翻转。计数到0xffffh时,电平不受影响。

显然OutPut Mode4就是输出翻转模式。
图中Mode4是从低电平开始。所以在设置PWM占空比的时候,要注意一下顺序。

所以,第一步就是设置需要输出通道的中断。
假设定时器的时钟是2MH
假定需要通道1输出占空比45%,频率为x
CCR1相对独立,根据开头第二句话描述,他的频率就是(2MHz/CCR1).
频率(周期)确定后,就是要确定占空比,Mode4默认0电平开始
所以刚开始就是低电平时间,持续时长为CCR1 *45%.
当计数器值从0到达0.45CCR1时,翻转电平并记录一个标志,设置新的CCR1值为last_CCR1+0.55CCR1.
last_CCR1直接读寄存器即可,黄色标识的值根据情况而不同,要根据标志确定是0.55(高)还是0.45(低)
。。。。。分割线。。。。。
通过以上操作看似CCR1是独立的,但计数器的值不是一直递增的。CCRn的值会发生溢出,但由于溢出时间与时基部分相同,因此无影响。
。。。。。分割线。。。。。

理论分析先到这里,代码几天后再补,下班了。

今天根据理论分析完成了代码,经过实测是有效的。

#include <msp430f5529.h>
#include "sysclock.h"
#include "syspmm.h"

//#define CCR1VAL 200  //0.5us*200=100us=0.1ms=>10KHz
//#define CCR2VAL 80   //0.5us*80 =40 us=0.04ms=>25KHz
//float CCR1ZhanKon = 0.45;//CCR1占空比
//float CCR2ZhanKon = 0.375;//CCR1占空比

char CCRFlag[2]={'H','H'};//切换标识
/**
 * main.c
 */
int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	SetVcoreUp(3);//提升电压至最高等级
	clock_init(4);//将DOC提升至4MHz。并作为SMCLK、MCLK来源
	P2DIR |= BIT2;//复用P2.2 查看频率是否正常
	P2SEL |= BIT2;

    P1DIR |= BIT2;//复用为TA0通道1
    P1SEL |= BIT2;

    P1DIR |= BIT3;//复用为TA0通道2
    P1SEL |= BIT3;

	//输出通道部分
	TA0CCTL1 = OUTMOD_4+ CCIE;//输出模式4,启用通道中断
	TA0CCTL2 = OUTMOD_4+ CCIE;//输出模式4,启用通道中断

	TA0CCR1 = 110;//低电平开始,所以翻转前时间是低电平时间
	TA0CCR2 = 20;//低电平时间=CCRnVAL*占空比
	//时基部分
    TA0CTL |= TASSEL_2 +ID_1+ MC_2 + TACLR ;//SMCLK二分频,连续计数,计数值清零
    _EINT();//开启总中断

    while (1)
    {

    }



	return 0;
}
unsigned int Temp;
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TimerA(void)
{
    switch (__even_in_range(TA0IV,14))
    {
    case 2://CCR1通道中断

        Temp = TA0CCR1;
        switch(CCRFlag[0])//依据标识选择高低时间
        {
        case 'H':
            TA0CCR1 = Temp + 90;//高电平持续时间   这里新设置值最好是常数(原因在下面说)
            CCRFlag[0] = 'L';
            break;
        case 'L':
            TA0CCR1 = Temp + 110;//低电平持续时间
            CCRFlag[0] = 'H';
            break;

        }
        break;
    case 4://CCR2通道中断
        Temp = TA0CCR2;
        switch(CCRFlag[1])
        {
        case 'H':
            TA0CCR2 = Temp + 50;//CCR最大为0xffffh,溢出从0开始,由于跟连续模式计时相同,故无影响(理论上)
            CCRFlag[1] = 'L';
            break;
        case 'L':
            TA0CCR2 = Temp + 30;
            CCRFlag[1] = 'H';
            break;
        }
        break;
    }
}


将通道1、通道2分别接上示波器,波形如下:

CH1 ↓👇
CH1波形

CH2 ↓👇
在这里插入图片描述

事实上还有一些疏漏,在实践的过程中,还遇到了以下问题。

1、在设置新的CCR值时,只能用常数

代码是这样子变化的:


            TA0CCR1 = Temp + (unsigned int)CCR1VAL*(1-CCR1ZhanKon);//高电平持续时间  
            //这样会引起异常:频率大幅度变化、并且输出的不是数字量
            //改成常数:
            TA0CCR1 = Temp + 90;
            //这样就正常了。

2、对于某些频率的一部分不同的占空比,会导致异常。

在CCR2中断里
有两个常数项
一个是高电平持续时间的所需计数值
一个是低电平持续时间的所需计数值
他们的和为一个PWM周期所需计数值
即c = a + b
在保持c不变的情况下,无法任意改变a、b的值。
输出上面CH2波形时,他们的值为a = 0.375(占空比)* 80=30、b = 0.625* 80=50
当a=b=40时亦正常。
但若a=70、b=10时,输出很不对劲,输出异常的取值似乎有很多.
我暂时找不到他们的关系。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

今天就先到这里,以后再想办法解决这两个问题~

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
msp430f5529是一款德州仪器的单片机,它具有多个定时器模块可以用来生成PWM信号。以下是使用msp430f5529定时器模块生成PWM输出的步骤: 1. 配置定时器模块:选择一个可用的定时器模块,并设置它的工作模式为PWM模式。 2. 设置定时器计数器:根据需要设置定时器的计数值,决定PWM信号的频率。 3. 设置占空比:根据需要设置CCR(捕获比较寄存器)的值,控制PWM信号的占空比。 4. 配置GPIO引脚:选择一个可用的GPIO引脚,并将其配置为PWM输出模式。 5. 启动定时器:启动定时器模块,开始生成PWM信号。 下面是一个使用msp430f5529定时器A0生成PWM输出的示例代码: ```c #include <msp430.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // 停用看门狗定时器 P1DIR |= BIT2; // 配置P1.2为输出 P1SEL |= BIT2; // 设置P1.2为TA0.1引脚 TA0CCR0 = 1000; // 设置计数器上限,决定PWM信号的频率 TA0CCTL1 = OUTMOD_7; // 设置TA0CCR1为PWM模式 TA0CCR1 = 500; // 设置占空比为50%(CCR0的一半) TA0CTL = TASSEL_2 + MC_1; // 设置时钟源为SMCLK,选择增计数模式 __bis_SR_register(LPM0_bits); // 进入低功耗模式 } ``` 上述代码中,P1.2引脚被配置为TA0.1引脚,连接到了定时器A0的CCR1输出。TA0CCR0的值决定了PWM信号的频率,而TA0CCR1的值决定了PWM信号的占空比。 请注意,以上代码仅为示例,具体的配置和使用方法可能需要根据你的实际需求进行调整。你可以根据msp430f5529的手册和参考资料进一步了解定时器模块的详细配置和使用方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值