首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ECT输出比较,为什么两个单独运行可以,用三个就不可以了,是不是有8位和16位区别

ECT输出比较,为什么两个单独运行可以,用三个就不可以了,是不是有8位和16位区别

我试过每个单独运行时都会产生625HZ左右,占空比30%左右的 PWM输出,只要屏蔽掉TC3输出,一切输出都正常,开TC3后,结果就不对了,TC3输出不是正常的波形,而单独打开TC3输出波形又没有什么问题,看程序中之间并没有相互的耦合关系,不明白什么原因,请指教~~

void Ect_init(void)
{
TIOS = 0xff;
OC7M = 0XFF;
OC7D = 0X00;
TCTL2 = 0XFc; // 设置TC1 TC2 TC3 比较产生输出高电平
TSCR2 = 0x0f; // 128 分频 ,计时器TOP值更改
TIE = 0X0E ; // 设置 TC1 TC2 TC3 中断
TC1 = 10;
TC2 = 110;
TC3 = 209;
TC7 = 65310; // 0<= TCNT <= TC7
TSCR1_TEN= 1;
}

interrupt void Enhanced_Capture_Timer_channel_1(void) //TIE0
{
unsigned int time1 ;
TFLG1_C1F=1;
time1 = TC1;

if( 1== TCTL2_OL1 )
{
time1 = time1 + 90 ; //128/24M*90秒,(500us)后输出低电平
TCTL2_OL1 = 0 ; //输出低电平
TC1 = time1;

}
else //如果当前输出低电平,则此刻输出高电平,并在一段时间后输出高电平
{
time1 = time1 + 210 ;

TCTL2_OL1 = 1 ; //输出高电平
TC1 = time1;

}

if( time1 > 64310 )
TC1 = 10 ;

}
interrupt void Enhanced_Capture_Timer_channel_2(void) //TIE0
{

unsigned int time2 ;
TFLG1_C2F=1;
time2 = TC2;
if( 1== TCTL2_OL2 )
{
time2 = time2 + 90 ; //128/24M*90秒,(500us)后输出低电平
TCTL2_OL2 = 0 ; //输出低电平
TC2 = time2;

}
else //如果当前输出低电平,则此刻输出高电平,并在一段时间后输出高电平
{
time2 = time2 + 210 ;
TCTL2_OL2 = 1 ; //输出高电平
TC2 = time2;

}
if(time2 > 65310 )
TC2 = 110 ;


}
interrupt void Enhanced_Capture_Timer_channel_3(void) //TIE0
{
unsigned int time3 ;

TFLG1_C3F = 1 ;

time3 = TC3 ;
if( 1== TCTL2_OL3 )
{

time3 = time3 + 90 ; //128/24M*90秒,(500us)后输出低电平
TCTL2_OL3 = 0 ; //输出低电平
TC3 = time3;


}
else //如果当前输出低电平,则此刻输出高电平,并在一段时间后输出高电平
{

time3 = time3 + 209 ;

TCTL2_OL3 = 1 ; //输出高电平
TC3 = time3;
}

if( time3 > 65310 )
TC3 = 209 ;

}
//

是不是由于通道数增多以后,尚未来得及处理通道3的中断
楼主片子的型号?
你将OCM7设置为0xFF,就是说,所有的定时器输出口要受通道7的控制,当通道7发生比较事件时,所有的输出口要变为OC7D所设置的电平。这是你的本意吗?
海纳百川  有容乃大
另外,TCTL2_OLn并不直接控制通道n的电平,而是控制下一次比较事件发生时的电平变化方式。如果你要每次发生比较事件时都翻转电平,则设置为TCLT2_OMn = 0, TCLT2_OLn=1即可。同时,OCM7中相应的控制位应设为0.
海纳百川  有容乃大
返回列表