OpenEdv-开源电子网

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

请问大家有没有遇到过这种情况,就是在pwm调速后小车不能朝不同方向走之内单独向前或其他方向,这是为什么啊

[复制链接]

1

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-5-12
在线时间
61 小时
发表于 2019-10-19 11:06:48 | 显示全部楼层 |阅读模式
1金钱
这个是我的垃圾程序,希望各位大佬能帮忙看看

#define MotorA_in1 PAout(6)
#define MotorA_in2 PAout(7)
#define MotorB_in3 PBout(6)
#define MotorB_in4 PAout(0)
#define MotorC_in1 PBout(9)
#define MotorC_in2 PBout(8)
#define MotorD_in3 PAout(2)
#define MotorD_in4 PAout(3)


void TIM4_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseINIT;
        NVIC_InitTypeDef NVIC_INIT;
        //TIM4时钟使能  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);       
        //设定计数器自动重装值//刚好1ms
        TIM_TimeBaseINIT.TIM_ClockDivision=0;
        TIM_TimeBaseINIT.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseINIT.TIM_Period=arr;
        TIM_TimeBaseINIT.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseINIT);   
       
        TIM_Cmd(TIM4,ENABLE);
       
        NVIC_INIT.NVIC_IRQChannel=TIM4_IRQn;
        NVIC_INIT.NVIC_IRQChannelCmd=ENABLE;
        NVIC_INIT.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_INIT.NVIC_IRQChannelSubPriority=1;
         NVIC_Init(&NVIC_INIT);//抢占1,子优先级3,组2                                                                         
}

void TIM4_PWM_Init(u16 arr,u16 psc)
{       
        TIM_OCInitTypeDef TIM_OCInitstruct;       
        GPIO_InitTypeDef    GPIO_InitStrucyure;
        TIM_TimeBaseInitTypeDef TIM_Timeinit;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);                //TIM3时钟使能   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);            //使能PORTB时钟       
       
        GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStrucyure);
       
        TIM_Timeinit.TIM_ClockDivision=0;
        TIM_Timeinit.TIM_CounterMode=TIM_OCMode_PWM2;
        TIM_Timeinit.TIM_Period=arr;
        TIM_TimeBaseInit(TIM4,&TIM_Timeinit);
       
        TIM_OCInitstruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitstruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitstruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
       
        TIM_OC1Init(TIM4, &TIM_OCInitstruct);
        TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
       
        TIM_OC2Init(TIM4, &TIM_OCInitstruct);
        TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
       
        TIM_OC3Init(TIM4, &TIM_OCInitstruct);
        TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
       
        TIM_OC4Init(TIM4, &TIM_OCInitstruct);
        TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(TIM4, ENABLE);
        TIM_Cmd(TIM4,ENABLE);
       
}

void TIM3_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseINIT;
        NVIC_InitTypeDef NVIC_INIT;
        //TIM4时钟使能  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);       
        //设定计数器自动重装值//刚好1ms
        TIM_TimeBaseINIT.TIM_ClockDivision=0;
        TIM_TimeBaseINIT.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseINIT.TIM_Period=arr;
        TIM_TimeBaseINIT.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM4,&TIM_TimeBaseINIT);   
       
        TIM_Cmd(TIM3,ENABLE);
       
        NVIC_INIT.NVIC_IRQChannel=TIM3_IRQn;
        NVIC_INIT.NVIC_IRQChannelCmd=ENABLE;
        NVIC_INIT.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_INIT.NVIC_IRQChannelSubPriority=2;
         NVIC_Init(&NVIC_INIT);//抢占1,子优先级3,组2                                                                         
}

void TIM3_PWM_Init(u16 arr,u16 psc)
{       
        TIM_OCInitTypeDef TIM_OCInitstruct;       
        GPIO_InitTypeDef    GPIO_InitStrucyure;
        TIM_TimeBaseInitTypeDef TIM_Timeinit;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                //TIM3时钟使能   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);            //使能PORTB时钟       
       
        GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_6;
        GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStrucyure);
       
       
        TIM_Timeinit.TIM_ClockDivision=0;
        TIM_Timeinit.TIM_CounterMode=TIM_OCMode_PWM2;
        TIM_Timeinit.TIM_Period=arr;
        TIM_TimeBaseInit(TIM3,&TIM_Timeinit);
       
       
        TIM_OCInitstruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitstruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitstruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM3, &TIM_OCInitstruct);
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
       
        TIM_OC1Init(TIM3, &TIM_OCInitstruct);
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(TIM3, ENABLE);
        TIM_Cmd(TIM3,ENABLE);
       
}

void TIM2_Int_Init(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseINIT;
        NVIC_InitTypeDef NVIC_INIT;
        //TIM4时钟使能  
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);       
        //设定计数器自动重装值//刚好1ms
        TIM_TimeBaseINIT.TIM_ClockDivision=0;
        TIM_TimeBaseINIT.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseINIT.TIM_Period=arr;
        TIM_TimeBaseINIT.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseINIT);   
       
        TIM_Cmd(TIM2,ENABLE);
       
        NVIC_INIT.NVIC_IRQChannel=TIM2_IRQn;
        NVIC_INIT.NVIC_IRQChannelCmd=ENABLE;
        NVIC_INIT.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_INIT.NVIC_IRQChannelSubPriority=3;
         NVIC_Init(&NVIC_INIT);//抢占1,子优先级3,组2                                                                         
}

void TIM2_PWM_Init(u16 arr,u16 psc)
{       
        TIM_OCInitTypeDef TIM_OCInitstruct;       
        GPIO_InitTypeDef    GPIO_InitStrucyure;
        TIM_TimeBaseInitTypeDef TIM_Timeinit;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);               
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);                   
       
        GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
        GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStrucyure);
       
       
        TIM_Timeinit.TIM_ClockDivision=0;
        TIM_Timeinit.TIM_CounterMode=TIM_OCMode_PWM2;
        TIM_Timeinit.TIM_Period=arr;
        TIM_TimeBaseInit(TIM2,&TIM_Timeinit);
       
       
        TIM_OCInitstruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitstruct.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitstruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM2, &TIM_OCInitstruct);
        TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
       
        TIM_OC4Init(TIM2, &TIM_OCInitstruct);
        TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable);
       
        TIM_OC1Init(TIM2, &TIM_OCInitstruct);
        TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);
       
       
       
        TIM_ARRPreloadConfig(TIM2, ENABLE);
        TIM_Cmd(TIM2,ENABLE);
       
}

这是四个电机的方向
//C轮反转
void C_anti_Round()
{
        TIM_SetCompare3(TIM4,500);
        MotorC_in1=1;
        MotorC_in2=0;
}

//C轮正转
void C_round()
{
        TIM_SetCompare4(TIM4,600);
        MotorC_in1=0;
        MotorC_in2=1;
}

//B轮反转
void B_ANTI_ROUND()
{
        TIM_SetCompare1(TIM4,500);       
        MotorB_in3=1;
        MotorB_in4=0;
}

//B轮正转
void B_ROUND()
{
        TIM_SetCompare1(TIM2,600);       
        MotorB_in3=0;
        MotorB_in4=1;
}

//A轮反转
void A_anti_round()
{
        TIM_SetCompare2(TIM3,500);
        MotorA_in1=1;
        MotorA_in2=0;
}
//A轮正转
void A_round()
{
        TIM_SetCompare1(TIM3,600);
        MotorA_in1=0;
        MotorA_in2=1;
}

//D轮反转
void D_anti_round()
{
        TIM_SetCompare3(TIM2,500);
        MotorD_in3=1;
        MotorD_in4=0;
}       
//D正转
void D_round()
{
        TIM_SetCompare4(TIM2,600);
        MotorD_in3=0;
        MotorD_in4=1;
}


小车测试2.zip

8.97 MB, 下载次数: 27

这是整个小车完整的程序

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-10-20 02:03:20 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-6 19:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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