使用的模模式,比较模式6.,可以正常输出指定周期和占空比的单个pwm。此为前提。
现有三种波。
A:周期10ms,占空比10%。
B:40ms 50%
C:30ms 20%
初始化输出A,然后轮流输出B和C,间隔为200ms,
结果:
上电正常输出A持续200ms,然后每隔200ms输出B,中间应该输出c的时间段恒定为高。
另外,如果B和C的周期相同,只有占空不一样倒是可以循环输出B和C.
猜想:B和C这两个波形总是输出的周期较大的一个。我是通过重写t1cc0和t1cc4这两个寄存器(自己写的函数如下),是因为不能这样写,还是t1cc0写一个更小的值会无效啊?求解答。谢谢
void setT1Pwm(uint8 t1cc0l,uint8 t1cc4l)
{
T1CTL &= ~(3); //暂停定时器
T1CC0L = t1cc0l; T1CC0H = 0x00;
T1CC4L=t1cc4l;
T1CC4H=0x00;
T1CCTL4 |=0x04;
T1CTL |=(1<<1);
}
斌斌有礼:
重写T1CC0是改变周期,T1CC4是改变占空比,还有就是比较模式的选择,你代码T1CCTL4 |=0x04;这设置的也不是模式6,建议采用100: Clear output on compare-up, set on compare down in up-and-down mode. Otherwise clear out put on compare, set on 0.,这个,模式下开始输出高电平,到达比较值后将为低电平,这样占空比就是T1CC4的值。还有一个问题是你什么时候更新这两个数值,应该在T1CC0一个周期结束后进入中断后开始更新这两个数值,这里要注意要将T1通道1设置为比较模式,模式的选择无所谓,你只是想要他在周期结束后进入中断,更新T1CC0和T1CC4,这是一点,还有一点要注意,你要把T1定时器通道4的中断关掉,只让T1通道1产生中断才可以进入中断函数这点很重要。配置完上述之后,就可以实现周期和占空比同时变化,但这不能满足你200ms,也不会达到200ms他持续的时间一定是T1CC0的倍数,你自己也可以想想,输出的周期都不一样怎么可能就都是200ms,要实现一定时间的持续,你可以累加进入中断函数的次数,也就是多少个T1CC0的周期,就是这样希望帮到你,即改周期又该占空比。
eric zhu:
回复 斌斌有礼:
感谢指导,按你说的解决了之前的问题,不过现在有个特别奇怪的现象。同一套程序在另一个2530的板子上进不去中断,这个可能是啥原因呀,
斌斌有礼:
回复 eric zhu:
这个一般都要单步调试看看,是没有产生中断,还是在中断程序里的判断条件导致进不了中断。
斌斌有礼:
回复 eric zhu:
还有一个问题 就是之前的那个问题,你每一次更新完T1CC0和T1CC4之后要重置T1CNTL和T1CNTH,否则会有一些误差。
eric zhu:
回复 斌斌有礼:
之前的数据误差我后面修正了。感谢提醒。不过现在我发现定时器能进中断了,但延时的时间居然会有误差。
count_start=GetTickCount();while((GetTickCount()-count_start)<n);
比如上面这两行,GetTickCount()会获得一个tick值,t3每隔1ms会进中断将tick加1,所以这两行应该能精确延时n个ms,
但有时候不到n就出来了,出来之后GetTickCount()-count_start也小于n,这个很不解啊。
TI中文支持网