//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();
}