控制电机的加减速,那就要用到pwm的初始化。也就是控制L298N的使能引脚。
1 GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer完全映射 TIM4_CH3->PD14 2 3 4 TIM_TimeBaseStructure.TIM_Period = arr; //重装载 5 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频 6 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 7 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 8 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
9 10 //初始化TIM4_channel3 pwm模式 11 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 12 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能 13 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性 14 TIM_OC3Init(TIM4, &TIM_OCInitStructure); //通道3的初始化 15 16 TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); 17 18 TIM_Cmd(TIM4, ENABLE);
还有IN1,IN2,IN3, IN4。 如果是使能1,就控制IN1和IN2。如果不是,这相反。
假设pwm控制使能1。则IN1,IN2就控制电机的转动方向。利用两个GPIO口就行了。
1 void JD_set(u8 x,u8 y) 2 { 3 JD1=x; 4 JD2=y; 5 }
可以在主函数中写一个函数,然后再USMART中调用,之后就可以在串口调试助手上直接控制电机的转动方向。
1 void JD_set(u8 x,u8 y) 2 { 3 JD1=x; 4 JD2=y; 5 } 6 7 int main(void) 8 { 9 u32 temp=0; 10 u16 pwmval=0; 11 u8 dir=1; 12 usmart_dev.init(SystemCoreClock/1000000); //72HZ 13 delay_init(); 14 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 15 uart_init(115200); //串口波特率 16 LED_Init(); 17 // TIM8_Cap_Init(0XFFFF,72-1); 18 JD_Init(); 19 TIM4_PWM_Init(899,0); //72MHZ/(899+1)=80KHZ 20 21 while(1) 22 { 23 24 25 delay_ms(10); 26 if(dir)pwmval++; 27 else pwmval--; 28 29 if(pwmval>899)dir=0; 30 if(pwmval==0)dir=1; 31 TIM_SetCompare3(TIM4,pwmval); 32 } 33 }
这样电机就能加速减速了
实物图: