pwm.h
#ifndef __PWM_H
#define __PWM_H
#include "stm32f4xx.h"
void TIM9_PWM_Init(u32 arr,u32 psc);
void TIM1_PWM_Init(u32 arr,u32 psc);
#endif
PWM.c
#include "pwm.h"
#include "led.h"
void TIM9_PWM_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
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);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM9, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM9,ENABLE);
TIM_Cmd(TIM9, DISABLE);
TIM_CtrlPWMOutputs(TIM9,ENABLE);
}
void TIM1_PWM_Init(u32 arr,u32 psc)
{
int ccr1=50,ccr2=50,ccr3=50,ccr4=50;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_TimeBaseStructure.TIM_Prescaler=psc;
TIM_TimeBaseStructure.TIM_Period=arr;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = ccr1;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = ccr2;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = ccr3;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = ccr4;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
}
motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
#include "stm32f4xx.h"
#include "pwm.h"
#include "delay.h"
#include "sys.h"
#define L1A1 PDout(2)
#define L1A2 PDout(3)
#define L2B1 PDout(0)
#define L2B2 PDout(1)
#define R1A1 PDout(11)
#define R1A2 PDout(10)
#define R2B1 PBout(14)
#define R2B2 PBout(15)
#define stop() {L1A1=0;L1A2=0; L2B1=0;L2B2=0; R1A1=0;R1A2=0; R2B1=0;R2B2=0;}
#define moveforward() {L1A1=1;L1A2=0; L2B1=1;L2B2=0; R1A1=1;R1A2=0; R2B1=1;R2B2=0;}
#define moveback() {L1A1=0;L1A2=1; L2B1=0;L2B2=1; R1A1=0;R1A2=1; R2B1=0;R2B2=1;}
#define moveturnleft() {L1A1=0;L1A2=1; L2B1=0;L2B2=1; R1A1=1;R1A2=0; R2B1=1;R2B2=0;}
#define moveturnright() {L1A1=1;L1A2=0; L2B1=1;L2B2=0; R1A1=0;R1A2=1; R2B1=0;R2B2=1;}
#define L1A1_PIN GPIO_Pin_2
#define L1A1_PORT GPIOD
#define L1A1_CLK RCC_AHB1Periph_GPIOD
#define L1A2_PIN GPIO_Pin_3
#define L1A2_PORT GPIOD
#define L1A2_CLK RCC_AHB1Periph_GPIOD
#define L2B1_PIN GPIO_Pin_0
#define L2B1_PORT GPIOD
#define L2B1_CLK RCC_AHB1Periph_GPIOD
#define L2B2_PIN GPIO_Pin_1
#define L2B2_PORT GPIOD
#define L2B2_CLK RCC_AHB1Periph_GPIOD
#define R1A1_PIN GPIO_Pin_11
#define R1A1_PORT GPIOD
#define R1A1_CLK RCC_AHB1Periph_GPIOD
#define R1A2_PIN GPIO_Pin_10
#define R1A2_PORT GPIOD
#define R1A2_CLK RCC_AHB1Periph_GPIOD
#define R2B1_PIN GPIO_Pin_14
#define R2B1_PORT GPIOB
#define R2B1_CLK RCC_AHB1Periph_GPIOB
#define R2B2_PIN GPIO_Pin_15
#define R2B2_PORT GPIOB
#define R2B2_CLK RCC_AHB1Periph_GPIOB
#define T1PWM1M_psc 167
#define T1PWM10K_arr 99
enum MotorStateFlag{MotorStopFlag, MotorMoveFlag };
enum MotorDirFlag{MotorForwardFlag,MotorBackFlag};
extern enum MotorStateFlag MotorStateFlagNow;
extern enum MotorDirFlag MotorDirFlagNow;
void MotorInit(u32 timer1pwmFreq);
void MotorStop();
void MotorMoveForward(int vl1,int vl2,int vr1,int vr2);
void MotorMoveBack(int vl1,int vl2,int vr1,int vr2);
void MotorMove90Left(int vl1,int vl2,int vr1,int vr2);
void MotorMove90Right(int vl1,int vl2,int vr1,int vr2);
void MotorMove180(int vl1,int vl2,int vr1,int vr2);
#define L2() {MotorMoveForward(125*0.2,125*0.2,125*0.65,125*0.65);}
#define L1() {MotorMoveForward(125*0.35,125*0.35,125*0.65,125*0.65);}
#define L0() {MotorMoveForward(125*0.4,125*0.4,125*0.6,125*0.6);}
#define GO() {MotorMoveForward(125*0.45,125*0.45,125*0.45,125*0.45);}
#define R2() {MotorMoveForward(125*0.65,125*0.65,125*0.2,125*0.2);}
#define R1() {MotorMoveForward(125*0.5,125*0.5,125*0.25,125*0.25);}
#define R0() {MotorMoveForward(125*0.5,125*0.5,125*0.35,125*0.35);}
#define ST() { MotorStop();}
#endif
motor.c
#include "motor.h"
#include "tracksensor.h"
enum MotorStateFlag MotorStateFlagNow;
enum MotorDirFlag MotorDirFlagNow;
void MotorInit(u32 timer1pwmFreq)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd ( L1A1_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = L1A1_PIN | L1A2_PIN | L2B1_PIN | L2B2_PIN | R1A1_PIN | R1A2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(L1A1_PORT, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(R2B1_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = R2B1_PIN |R2B2_PIN ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(R2B1_PORT, &GPIO_InitStructure);
MotorStop();
TIM1_PWM_Init((int)(1000000/timer1pwmFreq)-1,167);
}
/*
MotorStop()
*/
void MotorStop()
{
stop();
MotorStateFlagNow=MotorStopFlag;
}
void MotorMoveForward(int vl1,int vl2,int vr1,int vr2)
{
if(MotorDirFlagNow==MotorBackFlag)
{
MotorStop();
Delay_ms(800);
}
TIM_SetCompare1(TIM1,vl1);
TIM_SetCompare2(TIM1,vl2);
TIM_SetCompare3(TIM1,vr1);
TIM_SetCompare4(TIM1,vr2);
moveforward();
MotorDirFlagNow=MotorForwardFlag;
MotorStateFlagNow=MotorMoveFlag;
}
void MotorMoveBack(int vl1,int vl2,int vr1,int vr2)
{
if(MotorDirFlagNow==MotorForwardFlag)
{
MotorStop();
Delay_ms(800);
}
TIM_SetCompare1(TIM1,vl1);
TIM_SetCompare2(TIM1,vl2);
TIM_SetCompare3(TIM1,vr1);
TIM_SetCompare4(TIM1,vr2);
moveback();
MotorDirFlagNow=MotorBackFlag;
MotorStateFlagNow=MotorMoveFlag;
}
void MotorMove90Left(int vl1,int vl2,int vr1,int vr2)
{
if(MotorDirFlagNow==MotorBackFlag)
{
MotorStop();
Delay_ms(800);
}
TIM_SetCompare1(TIM1,vl1);
TIM_SetCompare2(TIM1,vl2);
TIM_SetCompare3(TIM1,vr1);
TIM_SetCompare4(TIM1,vr2);
moveturnleft();
MotorDirFlagNow=MotorForwardFlag;
MotorStateFlagNow=MotorMoveFlag;
if(MS==1 || RS0==1)
{
MotorStop();
}
}
void MotorMove90Right(int vl1,int vl2,int vr1,int vr2)
{
if(MotorDirFlagNow==MotorBackFlag)
{
MotorStop();
Delay_ms(800);
}
TIM_SetCompare1(TIM1,vl1);
TIM_SetCompare2(TIM1,vl2);
TIM_SetCompare3(TIM1,vr1);
TIM_SetCompare4(TIM1,vr2);
moveturnright();
MotorDirFlagNow=MotorForwardFlag;
MotorStateFlagNow=MotorMoveFlag;
if(MS==1 || RS0==1)
{
MotorStop();
}
}
void MotorMove180(int vl1,int vl2,int vr1,int vr2)
{
if(MotorDirFlagNow==MotorBackFlag)
{
MotorStop();
Delay_ms(800);
}
TIM_SetCompare1(TIM1,vl1);
TIM_SetCompare2(TIM1,vl2);
TIM_SetCompare3(TIM1,vr1);
TIM_SetCompare4(TIM1,vr2);
moveturnleft();
MotorDirFlagNow=MotorForwardFlag;
MotorStateFlagNow=MotorMoveFlag;
if(MS==1 || RS0==1)
{
}
}
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "beep.h"
#include "exti.h"
#include "timer.h"
#include "pwm.h"
#include "motor.h"
#include "tracksensor.h"
#define whiteline 0
#define blackline 1
int flag=0;
int main(void)
{
u8 key_flag = 0;
u8 i=0;
int led0val=0;
int led1val=0;
Delay_Init();
LED_Init();
BEEP_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
EXTIX_Init();
MotorInit(8000);
while (1)
{
L2();
Delay_ms(40);
L1();
Delay_ms(40);
GO();
Delay_ms(40);
ST();
Delay_ms(40);
}
}
说明:修改了
频率是8000,最大是100000/8000=125 根据实际情况,修改这个数字比例,左大专等都需要修改