新手上路
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2019-4-7
- 在线时间
- 3 小时
|
发表于 2019-4-27 15:10:23
|
显示全部楼层
#include "motor_control.h"
#include "sys.h"
#include "usart.h"
#define ONWARD 1
#define BACKWARD 0
extern vu8 count;
extern vu32 averge_distance;
vu8 left,right,middle;
vu32 S2;
vu32 S4;
vu32 S1;
vu32 timer;
int i;
//u16 Pwm_Right;
//u16 Pwm_Left;
/**************************************
函数名 :Control_GPIO_Config
函数描述:配置Control小车用到的I/O口
输入参数:无
输出参数:无
**************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义两个GPIO_InitTypeDef类型的结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE);//开启GPIOA外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0|GPIO_Pin_13; //选择要控制的GPIOA引脚(PA.4,pa5端口配置)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置引脚模式为推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置引脚速度为50Mhz
GPIO_Init(GPIOC,&GPIO_InitStructure); //调用库函数初始化 GPIOA
//刚开始停止电机转动
GPIO_ResetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_0|GPIO_Pin_13);
}
void TIM3_Configuration(u16 CCR_Val_12,u16 CCR_Val_34)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//CCR_Val_12 = 900;
//CCR_Val_34 = 900;
/* -----------------------------------------------------------------------
TIM3 Configuration: generate 2 PWM signals with 2 different duty cycles:
TIM3CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
TIM3 Frequency = 36 KHz.
TIM3 Channel1 duty cycle = (CCR_Val_12/ TIM3_ARR)* 100 = 50%
TIM3 Channel1 duty cycle = (CCR_Val_34/ TIM3_ARR)* 100 = 50%
----------------------------------------------------------------------- */
/***通道1的配置*****/
TIM_TimeBaseStructure.TIM_Period = 999; //设定总周期值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置预分频:不预分频,即为36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR_Val_12; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR_Val时为高电平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR_Val_34; //设置通道3的电平跳变值,输出另外一个占空比的PWM
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/***通道3的配置*****/
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重载寄存器ARR
TIM_Cmd(TIM3, ENABLE); //使能定时器3
}
/*************前进***********/
void Forward_run(void)
{
/*左侧轮子停转*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//0
GPIO_SetBits(GPIOC,GPIO_Pin_3);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_0);//0
GPIO_SetBits(GPIOC,GPIO_Pin_13);//1
}
/*************后退***********/
void Backward_run(void)
{
/*左侧轮子停转*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
GPIO_SetBits(GPIOC,GPIO_Pin_2);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_3);//0
GPIO_SetBits(GPIOC,GPIO_Pin_0);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//0
} |
|