新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2016-7-19
- 在线时间
- 2 小时
|

楼主 |
发表于 2016-12-8 18:25:43
|
显示全部楼层
我把代码贴出来
定时器设置
void PWM_Init(u16 arr,u16 psc)
{ // TIM_TimeBaseInitTypeDef TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EnableMotor_Init(); //初始化电机控制所需IO
RCC->APB2ENR|=1<<11; //使能TIM1时钟
RCC->APB2ENR|=1<<2; //PORTA时钟使能 PA8通道4 PA11通道1
GPIOA->CRH&=0XFFFF0FF0; //PORTA8 11复用输出
GPIOA->CRH|=0X0000B00B; //PORTA8 11复用输出
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ; //定时器1溢出中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //===清除定时器1中断标志位
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_Trigger ,ENABLE);//开启中断
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器分频
TIM1->CCMR2|=6<<12; //CH4 PWM1模式
TIM1->CCMR1|=6<<4; //CH1 PWM1模式
TIM1->CCMR2|=1<<11; //CH4预装载使能
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCER|=1<<12; //CH4输出使能
TIM1->CCER|=1<<0; //CH1输出使能
TIM1->BDTR |= 1<<15; //TIM1必须要这句话才能输出PWM
TIM1->CR1=0x8000; //ARPE使能
TIM1->CR1|=0x01; //使能定时器1
}
中断服务函数
int TIM1_UP_IRQHandler(void)
{
if( TIM_GetFlagStatus(TIM1,TIM_FLAG_Update)!=RESET)
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //===清除定时器1中断标志位
count++;
if(count==100) //10ms定时中断
{ count =0;
Encoder=Read_Encoder(2); //===读取编码器的值,M法测速,输出为每10ms的脉冲数
Moto1_Left=Incremental_PI(Encoder,Target_Left);
Encoder=Read_Encoder(4); //===读取编码器的值,M法测速,输出为每10ms的脉冲数
Moto1_Right=Incremental_PI(Encoder,Target_Right); //===速度PI控制器
Limit(); //===PWM限幅
Set_Pwm(Moto1_Left,Moto1_Right); //===赋值给PWM寄存器
}
return 0;
}
不明白问题出在哪了,求指教
|
|