本帖最后由 llqzx 于 2016-12-27 13:55 编辑
如图,使用定时器的两个通道来输出频率相同,数目不同的脉冲,会在输出最后出现一个宽度为2us或者1us的不正常脉冲。
代码如下:
[mw_shl_code=c,true]void LSMV5()
{
TIM3->CNT = 0;
TIM3->CCER |= 1<<0;//OC1 输出使能
TIM3->CCER |= 1<<4;//OC2 输出使能
TIM3->CCER |= 1<<8;//OC3 输出使能
TIM3->CR1 |= 0x01; //使能定时器3
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if(TIM3->SR & 0X0002)//捕捉比较1中断
{
LeftMotorXPulseCount++;
if(LeftMotorXPulseCount >=20)
{
TIM3->CCER &= 0xFFFE;//输出比较1输出禁止
LeftMotorXPulseCount = 0;
}
TIM3->SR&=~(1<<1);//清除中断标志位
}
if(TIM3->SR & 0X0004)//捕捉比较2中断
{
LeftMotorYPulseCount++;
if(LeftMotorYPulseCount >=10)
{
TIM3->CCER &= 0xFFEF;//输出比较2预装载关闭
LeftMotorYPulseCount = 0;
}
TIM3->SR&=~(1<<2);//清除中断标志位
}
if(TIM3->SR & 0X0008)//捕捉比较3中断
{
LeftMotorZPulseCount++;
if(LeftMotorZPulseCount >=100)
{
TIM3->CCER &= 0xFEFF;//输出比较3预装载关闭
LeftMotorZPulseCount = 0;
}
TIM3->SR&=~(1<<3);//清除中断标志位
}
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
RCC->APB1ENR |= 1<<1;//使能TIM3时钟
RCC->APB2ENR |= 0x0d;//使能PORTA PORTB AFIO时钟
GPIOA->CRL &=0x00FFFFFF;
GPIOA->CRL |=0xBB000000;//复用输出
GPIOB->CRL &=0xFFFFFFF0;
GPIOB->CRL |=0x0000000B;//复用输出
GPIOA->ODR|=0<<6; //PA.6输出低
GPIOA->ODR|=0<<7; //PA.7输出低
GPIOB->ODR|=0<<0; //PB.0输出低
TIM3->ARR = arr;
TIM3->PSC = psc;
TIM3->CCMR1 |= 7<<4;//CH1 PWM2模式
TIM3->CCMR1 |= 1<<3;//CH1预装载使能
// TIM3->CCER |= 1<<0;//OC1 输出使能
TIM3->DIER |= 1<<1; //捕捉比较1中断
TIM3->CCMR1 |= 7<<12;//CH2 PWM2模式
TIM3->CCMR1 |= 1<<11;//CH2预装载使能
// TIM3->CCER |= 1<<4;//OC2 输出使能
TIM3->DIER |= 1<<2; //捕捉比较2中断
TIM3->CCMR2 |= 7<<4;//CH3 PWM2模式
TIM3->CCMR2 |= 1<<3;//CH3预装载使能
// TIM3->CCER |= 1<<8;//OC3 输出使能
TIM3->DIER |= 1<<3; //捕捉比较3中断
MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2
TIM3->CCR1 = arr / 2;
TIM3->CCR2 = arr / 2;
TIM3->CCR3 = arr / 2;
TIM3->CR1 |= 1<<7;//ARPE使能
// TIM3->CR1 |= 0x01; //使能定时器3
}[/mw_shl_code]
要关闭你得提前,到PWM刚刚发生变化的时候,就关闭
一周热门 更多>