新手上路
- 积分
- 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是否正常?电压值,波形什么的。
然后就应该能找到问题了
|