4WD PWM控制

//car.c



#include "CAR.h"

#include "stm32f10x_gpio.h" //要用到物理引脚

#include "stm32f10x_rcc.h" //要用到时钟



void CAR_Init() 

{



 /*--------------对小车电机状态控制进行配置----------------*/

   GPIO_InitTypeDef GPIO_Structure; //创建配置结构体



  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开时钟 GPIOABCDE 都是 APB2

   

   //PB4关闭JTAG

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 AFIO:下一行要用

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁能jtag 不要改



   GPIO_Structure.GPIO_Pin= AIN2 | AIN1 | BIN2 | BIN1; //配置引脚



 // GPIO_Structure.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_8|GPIO_Pin_9;



  GPIO_Structure.GPIO_Mode=GPIO_Mode_Out_PP; //推完输出



  GPIO_Structure.GPIO_Speed=GPIO_Speed_50MHz; //最大翻转速度



  GPIO_Init(GPIOB,&GPIO_Structure); 





    GPIO_ResetBits(GPIOB,AIN2 | AIN1 | BIN2 | BIN1);





  

}



void Motor_PWM_Init(void)

{  

 GPIO_InitTypeDef GPIO_InitStructure;//结构体配置

 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//PWM本质是定时器实现

 TIM_OCInitTypeDef TIM_OCInitStructure;//比较输出相关参数



 //PWMA PB7

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟 找到APB1



   //GPIO的配置

 GPIO_InitStructure.GPIO_Pin = PWMA|PWMB; //TIM_CH2

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 复用

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //翻转速度

 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO



   //初始化TIM4

 TIM_TimeBaseStructure.TIM_Period = 1000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

 TIM_TimeBaseStructure.TIM_Prescaler = 36-1; //PWM周期是1ms 

 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim

 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位





 //初始化TIM4 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_OCInitStructure.TIM_Pulse = 0; //不设置0,一开就会跑



 TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC1



 TIM_OC2Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2



 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器

 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器



 TIM_Cmd(TIM4, ENABLE); //使能TIM4

}

void CAR_left_go() //左边轮子前进

{

  GPIO_SetBits(GPIOB,AIN2); //AIN2 set 1 GPIO_Pin_9 

   GPIO_ResetBits(GPIOB,AIN1); //AIN1 set 0

}

void CAR_right_go() //右边轮子前进

{

  GPIO_SetBits(GPIOB,BIN2); //BIN2 set 1

   GPIO_ResetBits(GPIOB,BIN1); //BIN1 set 0

}

void CAR_left_back() //左边轮子后退

{

  GPIO_SetBits(GPIOB,AIN1); //AIN1 set 1

   GPIO_ResetBits(GPIOB,AIN2); //AIN2 set 0

}

void CAR_right_back() //右边轮子后退

{

  GPIO_SetBits(GPIOB,BIN1); //BIN1 set 1

   GPIO_ResetBits(GPIOB,BIN2); //BIN2 set 0

}

void CAR_stop()

{

   GPIO_ResetBits(GPIOB,GPIO_Pin_8);

   GPIO_ResetBits(GPIOB,GPIO_Pin_5);

  GPIO_ResetBits(GPIOB,GPIO_Pin_9);

   GPIO_ResetBits(GPIOB,GPIO_Pin_4);

}

//car.h

#ifndef _CAR_
#define _CAR_

#include "stm32f10x.h"

#define PWMA GPIO_Pin_7
#define PWMB GPIO_Pin_6
#define AIN1 GPIO_Pin_8
#define AIN2 GPIO_Pin_9
#define BIN1 GPIO_Pin_5  //高电平
#define BIN2 GPIO_Pin_4  //低电平

void CAR_Init(void);  //初始化 

void Motor_PWM_Init(void);

void CAR_left_go(void);  //小车左轮正转

void CAR_right_go(void);  

void CAR_left_back(void);  

void CAR_right_back(void);  

void CAR_stop(void);  //小车停下


#endif

//car_s.h



#ifndef _car_1_

#define _car_1_



#include "stm32f10x.h"

//可以设置更多小车状态 声明

void car_go_front(uint16_t leftspeed,uint16_t rightspeed);



void car_go_back(uint16_t leftspeed,uint16_t rightspeed);



void car_turn_left(uint16_t leftspeed,uint16_t rightspeed);



void car_turn_right(uint16_t leftspeed,uint16_t rightspeed);





void car_round_left(uint16_t leftspeed,uint16_t rightspeed);



void car_round_right(uint16_t leftspeed,uint16_t rightspeed);



void car_stop(void);



#endif

//car_s.c



#include "CAR_S.h"

#include "CAR.h"





//PWM控制 宏定义

void car_go_front(uint16_t leftspeed,uint16_t rightspeed) // 前进

{

    CAR_left_go();

    CAR_right_go();   

    TIM_SetCompare2(TIM4, leftspeed);

   TIM_SetCompare1(TIM4, rightspeed);

}



void car_go_back(uint16_t leftspeed,uint16_t rightspeed) // 后退

{

    CAR_left_back();

    CAR_right_back();

    TIM_SetCompare2(TIM4, leftspeed);

   TIM_SetCompare1(TIM4, rightspeed);

}



void car_turn_left(uint16_t leftspeed,uint16_t rightspeed) //左转

{



    CAR_left_go();

    CAR_right_go();

    TIM_SetCompare2(TIM4, 0);//占空比给0 左侧轮子不转 但右侧轮子还在转 达到左转

   TIM_SetCompare1(TIM4, rightspeed);

}

void car_turn_right(uint16_t leftspeed,uint16_t rightspeed) //右转

{



    CAR_left_go();

    CAR_right_go();

    TIM_SetCompare2(TIM4, leftspeed);

   TIM_SetCompare1(TIM4, 0);

}

void car_round_left(uint16_t leftspeed,uint16_t rightspeed) //左打转

{



    CAR_left_back();

    CAR_right_go();

    TIM_SetCompare2(TIM4, leftspeed);

   TIM_SetCompare1(TIM4, rightspeed);

}

void car_round_right(uint16_t leftspeed,uint16_t rightspeed) //右打转

{



    CAR_left_go();

    CAR_right_back();

    TIM_SetCompare2(TIM4, leftspeed);

   TIM_SetCompare1(TIM4, rightspeed);

}

void car_stop() //停下

{

   CAR_stop();





}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值