| 
 
新手上路 
 
	积分42金钱42 注册时间2018-10-9在线时间11 小时 | 
 
6金钱 
| 本帖最后由 37Coby 于 2018-11-6 20:41 编辑 
 大家好,我最近用直流电机做小车遇到了一个问题,不知道怎么回事,请大家帮我看看
 问题:
 为什么给L298N使能端有pwm控制后,不能控制电机正反转?
 
 描述:
 目标:实现单个直流电机PWM控速+正反转
 硬件:stm32f407+l298n
 IO连接:ENA-PE5     (TIM9_CH1,用于输出pwm波)
 IN1-PE1
 IN2-PE2
 执行现象:电机更改占空比可调速,不论怎么更改IN1,IN2极性,都无法控制正反转
 程序:
 void MOTOR_Init(void)
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 
 /* Enable  GPIOC clock */
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
 
 /* 配置电机驱动 IO 口为推挽输出  */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2 ;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOE, &GPIO_InitStructure);
 
 }
 void TIM9_PWM_Init(u32 arr,u32 psc)
 {
 //此部分需手动修改IO口设置
 
 GPIO_InitTypeDef GPIO_InitStructure;
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 TIM_OCInitTypeDef  TIM_OCInitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);          //TIM9时钟使能
 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);         //使能PORT时钟
 
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9); //GPIO复用为定时器9
 GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9); //GPIO复用为定时器9
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;           //GPIO5,6
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
 GPIO_Init(GPIOE,&GPIO_InitStructure);              //初始化PE5
 
 TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
 TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);//初始化定时器9
 //初始化TIM14 Channel1 PWM模式
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
 TIM_OC1Init(TIM9, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM9 OC1
 TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);  //使能TIM9在CCR1上的预装载寄存器
 
 //初始化TIM14 Channel2 PWM模式
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低
 TIM_OC2Init(TIM9, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM9 OC1
 TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable);  //使能TIM9在CCR1上的预装载寄存
 
 TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPE使能
 
 TIM_Cmd(TIM9, ENABLE);  //使能TIM
 
 }
 
 int main(void)
 {
 //u16 led0pwmval=0;
 //u8 dir=1;
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
 delay_init(168);  //初始化延时函数
 uart_init(115200);//初始化串口波特率为115200
 LED_Init();
 TIM9_PWM_Init(2000-1,21-1);
 IN1=0;
 IN2=1;
 TIM_SetCompare1(TIM9,1600);        //修改比较值,修改占空比
 //TIM_SetCompare2(TIM9,1800);        //修改比较值,修改占空比
 
 while(1)
 {
 LED0=0;                          //LED0亮
 LED1=1;                                //LED1灭
 delay_ms(500);
 LED0=1;                                //LED0灭
 LED1=0;                                //LED1亮
 delay_ms(500);
 }
 
 }根据这个来弄
 
 根据这个来弄的   
 
 
 
 
 | 
 
最佳答案
查看完整内容[请看2#楼] 一个个信号测量。
首先L298N电源是否足够?不给PWM的时候,是否可以正反转?
然后,检查IN1~IN4的信号是否正常?电压值
然后,检查EN脚的PWM是否正常?电压值,波形什么的。
然后就应该能找到问题了 |