打印

MSP430输出可调占空比的PWM波失败

[复制链接]
4637|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pluto55|  楼主 | 2013-11-30 11:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
pluto55|  楼主 | 2013-11-30 11:59 | 只看该作者
一.这个实现的思路是:使用定时器的UP_MODE,配置CCIE的中断,在中断中对TA1CCR1进行更改,从面实现PWM波占空比的改变
//系统时钟配置为8Mhz,中断开启
        P2DIR |= 0x02;                            // P2.1  output
        P2SEL |= 0x02;                            // P2.1  配为定时器输出

        TA1CTL = TASSEL_2  + ID_3 + MC_1; //+ TAIE//  开启定时器   SMCLK, 8分频(1M) up mode
        TA1CCTL1 =  OUTMOD_7 + CCIE; //           // 工作模式7,使能CCR0中断,即最高优先级中断
        TA1CCR0 = 50;                             // PWM Period
        TA1CCR1 = 5;                              // 高电平时间
        while(1);

//中断代码:在中断中实现TA1CCR1在30和10之间的切换
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer_A(void)
{
switch( TA1IV )
{
   case  2:
invert_flag_1 ^= 1;
   if(invert_flag_1)
   {       
                TA1CCR1 = 30;                              // 高电平时间
   }
   else
   {
                TA1CCR1 = 10;                              // 高电平时间
   }
                      break;                          // CCR1 not used
   case  4: break;                          // CCR2 not used
   case 10:break;
}
}

二.P2.1 的输出波形:

tek00026.png (16.41 KB )

tek00026.png

使用特权

评论回复
板凳
dirtwillfly| | 2013-11-30 19:59 | 只看该作者
楼主能把全部代码传上来吗?只看给出的这两段程序,看不出有什么问题

使用特权

评论回复
地板
pluto55|  楼主 | 2013-12-2 12:09 | 只看该作者
问题找到了,还是对TI的定时器寄存器没有足够熟悉
TA1CCTL1 =  OUTMOD_7 + CCIE; //           // 工作模式7,使能CCR0中断,即最高优先级中断
上面这句代码使能的是CCR1定时到的中断
而我的目的实现应该是使能CCR0定时到的中断,在中断中更改CCR1
故应该配置为
TA1CCTL0 = CCIE;
另外在中断中还应注意一点:
在更改CCR1更改PWM波时应该将CCR1设置尽量接近CCR0,因为MSP430进入中断需要时间,
有这样的可能性:配置的CCR1太小,在TAR1计数达到CCR1之后,CCR1的赋值才实现,这样波形会失败

使用特权

评论回复
评分
参与人数 1威望 +8 收起 理由
dirtwillfly + 8 很给力!
5
1988020566| | 2013-12-2 23:35 | 只看该作者
直接计数的

使用特权

评论回复
6
pluto55|  楼主 | 2013-12-6 12:03 | 只看该作者
遇到这样一个问题:MSP430的定时器输出为什么会不能直接输出PWM波?而是要等待一段时间?
        P1DIR |= 0x08;                            // P1.3  output
        P1SEL |= 0x08;                            // P1.3 配为定时器输出
        TA0CCTL2 = OUTMOD_7 ;         // 工作模式7,
        TA0CCR0 = 40-1;                             // PWM Period
        TA0CCR2 = 39;                              // 高电平时间

        TA0CTL = TASSEL_2 + MC_1;   开启定时器   SMCLK, up mode

波形如下:有办法把这7.4us去掉吗?

tek00027.png (15.14 KB )

定时器PWM波形

定时器PWM波形

使用特权

评论回复
7
dirtwillfly| | 2013-12-6 12:20 | 只看该作者
pluto55 发表于 2013-12-6 12:03
遇到这样一个问题:MSP430的定时器输出为什么会不能直接输出PWM波?而是要等待一段时间?
        P1DIR |= ...

额,有新的问题建议重新发帖。
原来的问题解决了就及时结贴。结贴方法:https://bbs.21ic.com/icview-442857-1-1.html
如果需要找我可以 @dirtwillfly ,这样我一上线就能看到:handshake

使用特权

评论回复
8
dirtwillfly| | 2013-12-6 13:22 | 只看该作者
pluto55 发表于 2013-12-6 12:03
遇到这样一个问题:MSP430的定时器输出为什么会不能直接输出PWM波?而是要等待一段时间?
        P1DIR |= ...

没注意过这个问题。可能的原因有:配置PWM以及系统启动相应组件的时间。你调试程序的时候,看看配置PWM需要多长时间?

使用特权

评论回复
9
pluto55|  楼主 | 2013-12-6 13:31 | 只看该作者
dirtwillfly 发表于 2013-12-6 13:22
没注意过这个问题。可能的原因有:配置PWM以及系统启动相应组件的时间。你调试程序的时候,看看配置PWM需 ...

上电之后管脚是维持高电平,直到配置
P1DIR |= 0x08;                            // P1.3  output
这句代码,电平会从高到低,
版主所说系统配置PWM时间怎么测?

使用特权

评论回复
10
dirtwillfly| | 2013-12-6 13:34 | 只看该作者
本帖最后由 dirtwillfly 于 2013-12-6 13:43 编辑
pluto55 发表于 2013-12-6 13:31
上电之后管脚是维持高电平,直到配置
P1DIR |= 0x08;                            // P1.3  output
这句 ...

就是配置PWM那几句程序的时间。
配置成输出状态,默认好像就是低电平

使用特权

评论回复
11
dirtwillfly| | 2013-12-6 13:47 | 只看该作者
如果想让IO默认输出时高电平,可以加个电阻上拉到VCC

使用特权

评论回复
12
pluto55|  楼主 | 2013-12-6 14:06 | 只看该作者
dirtwillfly 发表于 2013-12-6 13:47
如果想让IO默认输出时高电平,可以加个电阻上拉到VCC

1.外部已经加了10K的上拉电阻到3.3V
2.根据手册的要求,我必须得把它配置为输出模式,而一配置为输出模式,就被拉成了低电平

RTX截图未命名.png (668.76 KB )

手册说明

手册说明

使用特权

评论回复
13
dirtwillfly| | 2013-12-6 15:01 | 只看该作者
pluto55 发表于 2013-12-6 14:06
1.外部已经加了10K的上拉电阻到3.3V
2.根据手册的要求,我必须得把它配置为输出模式,而一配置为输出模式 ...

你试过先把输出寄存器写1,然后再把IO改为输出状态吗?一般输出寄存器里的值复位之后不变
我手里没有示波器,不让可以帮你测试下。

使用特权

评论回复
14
pluto55|  楼主 | 2013-12-6 17:19 | 只看该作者
dirtwillfly 发表于 2013-12-6 15:01
你试过先把输出寄存器写1,然后再把IO改为输出状态吗?一般输出寄存器里的值复位之后不变
我手里没有示波 ...

试过的,代码添加一句:
P1OUT|= 0X08;
没有作用,一旦配置为定时器输出脚、输出模式后管脚电平被拉低了

使用特权

评论回复
15
pluto55|  楼主 | 2013-12-11 11:16 | 只看该作者
dirtwillfly 发表于 2013-12-6 15:01
你试过先把输出寄存器写1,然后再把IO改为输出状态吗?一般输出寄存器里的值复位之后不变
我手里没有示波 ...

这个问题,我是这样解决的,MSP430定时器有一个隐藏模式OUTMOD_0
可以通过配置:       
TA0CCTL2 = OUTMOD_0 + OUT;           // 工作模式0,将OUT位置高,则输出高电平
P1SEL |= 0x08;                       // P1.3 配为定时器输出:Timer0_A3_TA2
P1DIR |= 0x08;                       // P1.3  output
TA0CTL = TASSEL_2 + MC_1;           //  开启定时器   SMCLK,up mode
TA0CTL = MC_0;
这样后面需要使用OUTMODE_7的时候可以直接切换过去,不会有前面的那个脉冲了~

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
dirtwillfly + 4 赞一个!
16
zeluo| | 2013-12-11 17:34 | 只看该作者
看到楼上的两位讨论   我有点小惭愧啊   技术   还是欠缺很多   需要多向楼上的几位学习  请教   这一块   感觉自己的技术   欠缺的很多   

使用特权

评论回复
17
comeon201208| | 2013-12-11 22:59 | 只看该作者
pluto55 发表于 2013-12-2 12:09
问题找到了,还是对TI的定时器寄存器没有足够熟悉
TA1CCTL1 =  OUTMOD_7 + CCIE; //           // 工作模式 ...

定时器的相关寄存器的配置蛮重要的么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

88

帖子

2

粉丝