#include "stm32f10x.h"
#include "delay.h"
#include "pwm_output.h"
void RCC_Configuration(void);
void Moto_Configuration(void);
void SuperWave_Configuration(void);
uint32_t SuperWave_Distance(void);
void Car_Up(void); //前进
void Car_Right(void); //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
void Car_Left(void); //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
void Car_Stop(void); //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
int main(void)
{
vu32 n=0;
RCC_Configuration();
Moto_Configuration();
SuperWave_Configuration();
SystemInit(); //配置系统时钟为72M
TIM1_PWM_Init(); //TIM1 PWM波输出初始化,并使能TIM1 PWM输出
TIM1->CCR2 =28000; //右轮
TIM1->CCR3 =27000; //左轮
while(1)
{
if(SuperWave_Distance()<=30)
{
Car_Stop();
delay_ms(5);
Car_Left();
delay_ms(1000);
Car_Up();
delay_ms(5000);
Car_Right();
delay_ms(1000);
Car_Up();
delay_ms(10000);
Car_Right();
delay_ms(1000);
Car_Up();
delay_ms(10000);
Car_Left();
delay_ms(1000);
Car_Up();
delay_ms(5000);
}
else
{
Car_Up();
}
}
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
}
void SuperWave_Configuration(void) //超声波管脚配置
{
GPIO_InitTypeDef GPIO_InitStructure;
// EXTI_InitTypeDef EXTI_InitStructure;
// NVIC_InitTypeDef NVIC_InitStructure;
//触发信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//返回信号接收
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//返回信号触发中断
// GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
//EXTI_InitStructure.EXTI_Line = EXTI_Line8;
//EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
//EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//EXTI_Init(&EXTI_InitStructure);
//EXTI_InitStructure.EXTI_Line = EXTI_Line8;
//EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//EXTI_Init(&EXTI_InitStructure);
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
//NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
//NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//NVIC_Init(&NVIC_InitStructure);
}
u32 SuperWave_Distance(void) //超声波测距
{
u32 n=0,distance=0;
bool TestControl=true;
//触发20us
GPIO_SetBits(GPIOB,GPIO_Pin_9);
delay_us(20);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==RESET) //等待反馈信号
{
}
while(TestControl)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==SET)
{
delay_us(10);
n++;
if(n>400) //限定测距最大68cm。即4000us的来回总传播时间
{
TestControl=false;
}
}
else
{
TestControl=false;
}
}
distance=((float)n/100.0)*34.0/2.0; //距离CM
return distance;
}
void Moto_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Car_Up(void) //前进
{
//左电机正转
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
//右电机反转
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
void Car_Right(void) //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{
//左电机正转
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_SetBits(GPIOA,GPIO_Pin_1);
//右电机静止
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
void Car_Left(void) //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{
//左电机静止
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
//右电机反转
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}
void Car_Stop(void) //PA0-IN1,PA1-IN2管左电机 ;PA2-IN3,PA3-IN4管右电机
{
//左电机静止
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
//右电机静止
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
}