新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2017-11-29
- 在线时间
- 7 小时
|
本帖最后由 feng330724 于 2018-10-10 18:19 编辑
void Interrupt_Priority(u8 channel,u8 grab,u8 respon,INT_Group_Type group)
{
NVIC->IP[channel]=((grab<<(4-group))|respon)<<4;
NVIC->ISER[0]|=1<<channel;
}
/*左上电机的脉冲控制程序,PA0控制转动,PB5控制转向*/
void TIM_Left1_Init()
{
RCC->APB2ENR|=(1<<2)|(1<<0);//使能AFIO、GPIOA时钟
GPIOA->CRL&=0xfffffff0;
GPIOA->CRL|=0x0000000a; //配置PORTA.0为复用推挽输出,输出最大频率2MHz
RCC->APB1ENR|=1; //使能定时器TIMER2时钟
TIM2->PSC=64-1; //设置定时器2预分频值,使定时器得到1MHz的计数频率
TIM2->CR1|=1<<2; //设置只有计数溢出作为更新中断
TIM2->DIER|=1<<0; //允许定时器2计数溢出中断
Interrupt_Priority(28,0,2,group_2); //使能第28号中断(即定时器2全局中断),抢占0响应2,中断分组2
TIM2->CCMR1&=~(3<<0); //CC1通道配置为输出模式
TIM2->CCMR1|=7<<4; //输出比较1为PWM模式2
TIM2->CCER|=1<<0; //通道1输出使能
}
void TIM_Left1_Startup(u16 frequency) //启动定时器2
{
if(frequency<20) frequency=20; //最小频率设定为20,因为频率设定过小,得到的重装值会超出16位
TIM2->ARR=1000000/frequency-1; //设定重装值
TIM2->CCR1=TIM2->ARR>>1; //匹配值1等于重装值一半,是以占空比为50%
delay_ms(10); //脉冲信号比方向信号滞后,以提高可靠性
TIM2->CR1|=1<<0; //启动定时器TIMER2计数
}
void DRVI_Left1(long num,u16 frequency) //相对定位函数
{
if(num>0)
{
GPIOB->BSRR=1<<5;
}
else if(num<0)
{
GPIOB->BRR=1<<5;
}
mubiao_Left1=dangqian_Left1+num;
TIM_Left1_Startup(frequency);
}
void DRVA_Left1(long num,u16 frequency) //绝对定位函数
{
mubiao_Left1=num;
if(mubiao_Left1==dangqian_Left1)
{
run_Left1=OFF;
}
else
{
if(mubiao_Left1>dangqian_Left1)
{
GPIOB->BSRR=1<<5;
}
else
{
GPIOB->BRR=1<<5;
}
TIM_Left1_Startup(frequency);
}
}
void TIM2_IRQHandler() //定时器2全局中断函数
{
if(TIM2->SR&0x0001)
{
if(GPIOB->ODR&(1<<5)) //如果方向为正
{
dangqian_Left1++;
}
else //否则方向为负
{
dangqian_Left1--;
}
if(dangqian_Left1==mubiao_Left1) //计数溢出次数、也即输出的脉冲个数达到目标值
{
TIM2->CR1&=~(1<<0); //停止定时器2计数、也即停止脉冲输出
run_Left1=OFF; //复位脉冲定位指令执行标志
}
TIM2->SR=0x0000;
}
}
int main()
{
mubiao_Left1=0;//目标位置脉冲值
dangqian_Left1=0;//当前位置脉冲值
run_Left1=OFF;//脉冲定位指令执行标志
RCC->APB2ENR|=(1<<3);//使能GPIOB时钟
GPIOB->CRL&=0xff0fffff;
GPIOB->CRL|=0x00300000;//GPIOB.5配置为推挽输出,作为左上脉冲的方向信号输出
GPIOB->BRR=1<<5;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
TIM_Left1_Init();
DRVI_Left1(-200,200);//前进20脉冲
while(1)
{
}
}
|
|