main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "MOTOR.h"
#include "remote.h"
#include "HC-SR04.h"
extern float UltrasonicWave_Measure(void);
int main(void)
{
float distance;
u8 key=0;
UltrasonicWave_Init();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
Remote_Init();
TIM3_PWM_Init(400,0);
TIM5_PWM_Init(400,0);
while(1)
{
go_straight();
distance = UltrasonicWave_Measure();
if(distance < 50)
{
avoid_obstacle();
}
key=Remote_Scan();
if(key)
{
switch(key)
{
case 194:
turn_right();
break;
case 34:
turn_left();
break;
case 162:
stop();
break;
case 168:
back();
break;
}
}
}
}
timer.c
#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM3, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE);
}
void TIM5_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM5, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM5, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM5, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_Cmd(TIM5, ENABLE);
}
MOTOR.c
#include "MOTOR.h"
#include "delay.h"
#define INq1 PAout(0)
#define INq2 PBout(0)
#define INq3 PBout(1)
#define INq4 PAout(1)
#define INh1 PAout(6)
#define INh2 PAout(3)
#define INh3 PAout(2)
#define INh4 PAout(7)
void go_straight(void)
{
delay_ms(10);
TIM_SetCompare1(TIM3,250);
TIM_SetCompare2(TIM3,250);
TIM_SetCompare1(TIM5,250);
TIM_SetCompare2(TIM5,250);
delay_ms(200);
}
void turn_right(void)
{
delay_ms(10);
TIM_SetCompare1(TIM3,250);
TIM_SetCompare2(TIM3,50);
TIM_SetCompare1(TIM5,250);
TIM_SetCompare2(TIM5,50);
delay_ms(100);
}
void turn_light_right(void)
{
delay_ms(10);
TIM_SetCompare1(TIM3,250);
TIM_SetCompare2(TIM3,100);
TIM_SetCompare1(TIM5,250);
TIM_SetCompare2(TIM5,100);
delay_ms(300);
}
void turn_left(void)
{
delay_ms(10);
TIM_SetCompare1(TIM3,50);
TIM_SetCompare2(TIM3,250);
TIM_SetCompare1(TIM5,50);
TIM_SetCompare2(TIM5,250);
delay_ms(100);
}
void turn_light_left(void)
{
delay_ms(10);
TIM_SetCompare1(TIM3,100);
TIM_SetCompare2(TIM3,250);
TIM_SetCompare1(TIM5,100);
TIM_SetCompare2(TIM5,250);
delay_ms(300);
}
void stop(void)
{
while(1)
{
TIM_SetCompare1(TIM3,400);
TIM_SetCompare2(TIM3,400);
TIM_SetCompare1(TIM5,400);
TIM_SetCompare2(TIM5,400);
delay_ms(200);
}
}
void back(void)
{
TIM_SetCompare4(TIM5,0);
TIM_SetCompare3(TIM5,0);
TIM_SetCompare3(TIM3,0);
TIM_SetCompare4(TIM3,0);
delay_ms(200);
}
void avoid_obstacle(void)
{
turn_light_left();
turn_light_right();
turn_light_right();
turn_light_left();
}
HC-SR04.c
#include "HC-SR04.h"
#include "stm32f10x_tim.h"
#include "delay.h"
void UltrasonicWave_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_11);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
}
void UltrasonicWave_StartMeasure(void)
{
GPIO_SetBits(GPIOB, GPIO_Pin_11);
delay_us(20);
GPIO_ResetBits(GPIOB, GPIO_Pin_11);
}
float UltrasonicWave_Measure(void)
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==1);
UltrasonicWave_StartMeasure();
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 0);
TIM_SetCounter(TIM2,0);
TIM_Cmd(TIM2, ENABLE);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10) == 1);
TIM_Cmd(TIM2, DISABLE);
return (TIM_GetCounter(TIM2))/1000000.0*340/2 *100;
}