OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9792|回复: 4

为什么给L298N使能端pwm控制后,不能控制电机正反转

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-10-9
在线时间
11 小时
发表于 2018-11-6 20:41:37 | 显示全部楼层 |阅读模式
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是否正常?电压值,波形什么的。 然后就应该能找到问题了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-11-6 20:41:38 | 显示全部楼层
一个个信号测量。
首先L298N电源是否足够?不给PWM的时候,是否可以正反转?
然后,检查IN1~IN4的信号是否正常?电压值
然后,检查EN脚的PWM是否正常?电压值,波形什么的。
然后就应该能找到问题了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-10-9
在线时间
11 小时
 楼主| 发表于 2018-11-7 21:20:20 | 显示全部楼层
正点原子 发表于 2018-11-7 01:51
一个个信号测量。
首先L298N电源是否足够?不给PWM的时候,是否可以正反转?
然后,检查IN1~IN4的信号是 ...

我用示波器检测了引脚。
那个控制IN1和IN2的芯片引脚中,IN1的那个一直高电平,IN2的那个一直低。
不论怎么控制引脚极性,都是IN1那个高,
然后,我把PWM波去掉,ENA端用跳帽。
IN1,IN2单独控制电机,可以正反转,
然后,去掉跳帽,加上PWM波,又如我所问的那样了
真的很费解,我到底哪里不对;
然后,我又用时钟两个通道控制IN1,IN2。跳帽ENA,既可以控速,又可以正反。

原子哥,我都要疯了,求救
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-11-8 01:23:15 | 显示全部楼层
37Coby 发表于 2018-11-7 21:20
我用示波器检测了引脚。
那个控制IN1和IN2的芯片引脚中,IN1的那个一直高电平,IN2的那个一直低。
不论 ...

说明你的IN1脚控制有问题!检查代码或者硬件即可
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-4-12
在线时间
24 小时
发表于 2019-1-15 10:05:28 | 显示全部楼层
想问下楼主最后怎么解决的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表