外部中断函数
exti_interrupt_init(D3,EXTI_Trigger_Falling,0);//优先级 0-7
exti_interrupt_init(D2,EXTI_Trigger_Falling,2);//优先级 0-7
exti_interrupt_init(D0,EXTI_Trigger_Falling,0);//优先级 0-7
exti_interrupt_init(D1,EXTI_Trigger_Falling,2);//优先级 0-7
定时器中断
背景:
- 外部中断:主要采用按钮来改变参数的值
- 定时器中断:用来控制采样周期、控制周期,使采样周期稳定。
周期长,频率小,需要不断更新->采样周期应该小于控制周期。
定时器中断函数:zf_pit.c
定时器中断和外部中断一样,初始化后自动调用。
初始化时,编码器2ms
,舵机20ms
。(2代表时间)
数字小,优先级高(0x00 代表优先级)
tim_interrupt_init_ms(TIM_3, 2, 0x00);
频率f
相同,同一个模块(TIM_(1-8))
,不同频率模块需不同,初始化舵机/电机时,频率是相同的,所以可以采用同一个模块。
pwm_init(TIM_5,TIM_5_CH1_A00,17000,0); //初始化电机
pwm_init(TIM_5,TIM_5_CH2_A01,17000,0); //初始化电机
pwm_init(TIM_2,TIM_2_CH1_A15,50,720); //舵机初始化,最前面的,控制方向
其他
闭环:固定
开环:反馈->控制
旋转方向
void turn(int x)
{
if(x<0)
{
gpio_set(A2,0);
gpio_set(A3,0);
pwm_duty_updata (TIM_5,TIM_5_CH3_A02,-x);
pwm_duty_updata (TIM_5,TIM_5_CH4_A03,-x);
}
if(x>0)
{
gpio_set(A2,1);
gpio_set(A3,1);
pwm_duty_updata (TIM_5,TIM_5_CH3_A02,x);
pwm_duty_updata (TIM_5,TIM_5_CH4_A03,x);
}
}
延时函数、中断函数
void EXTI3_IRQHandler(void)
{
// 检测与清除中断标志可以根据实际应用进行删改
systick_delay_ms(20);//延时函数
if(gpio_get(D3)==0){ //当按键按下时发生改变
p+=20;
pwm_duty_updata (TIM_2,TIM_2_CH1_A15,p);//更新占空比
}
while(gpio_get(D3)==0){//当函数执行完毕时,不确定时间,需要判断电平是否等于1,等于1 的时候需要延时
}
systick_delay_ms(20);//延时函数
EXTI_ClearFlag(EXTI_Line3); // 清除 line3 触发标志//自动清除标志位,不然会与其他按钮弄混
}
其余草稿代码
while(1)
{
turn(2000);
systick_delay_ms (500);
turn(-2000);
systick_delay_ms (500);
gpio_set(B13,0);//LED灯
systick_delay_ms (500);
gpio_set(B13,1);
systick_delay_ms (500);
pwm_duty_updata (TIM_2,TIM_2_CH1_A00,3000);//正式调用
pwm_duty_updata (TIM_5,TIM_5_CH2_A01,2000);
pwm_duty_updata (TIM_2,TIM_2_CH1_A00,3000);//正式调用
pwm_duty_updata (TIM_5,TIM_5_CH2_A01,2000);
}gpio_init(B13,GPO,0,GPO_PUSH_PULL );//LED灯初始化
pwm_init(TIM_5,TIM_5_CH2_A01 ,10000,1500); //模块,名称,频率,占空比,反转
pwm_init(TIM_5,TIM_5_CH1_A00,10000,1500);//反转 1064
gpio_init(A2,GPO,0,GPO_PUSH_PULL);//方向初始化
gpio_init(A3,GPO,0,GPO_PUSH_PULL);
pwm_init(TIM_5,TIM_5_CH2_A01 ,10000,1500); //模块,名称,频率,占空比,反转
pwm_init(TIM_5,TIM_5_CH1_A00,10000,1500);//正转 1064
pwm_init(TIM_5,TIM_5_CH3_A02,10000,1500); //模块,名称,频率,占空比,反转
pwm_init(TIM_5,TIM_5_CH4_A03,10000,1500);//正转
//pwm_duty_updata(TIM_2,TIM_2_CH1_A00,1000);//更新占空比
gpio_init(A2,GPO,1,GPO_PUSH_PULL);//加上这1行,本来反转,后来正转 3277车
gpio_init(A3,GPO,1,GPO_PUSH_PULL);//加上这1行,本来反转,后来正转 3277车