智能小车
防坠落智能小车
心得:硬件设计需要细心,特别要注意各引脚和时钟的关系。有时候在两个不同头文件重复定义的相同引脚,会导致功能失效。另外可以用Led灯输出状态,这也是一个小技巧。
超声波模块实现防坠落
void Ultran1_Init(void)//前置超声波模块
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(ULTRA_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =ULTRA1_TRIG; //发送电平引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(ULTRA_PORT, &GPIO_InitStructure);
GPIO_ResetBits(ULTRA_PORT,ULTRA1_TRIG);
GPIO_InitStructure.GPIO_Pin =ULTRA1_ECHO; //接收电平引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(ULTRA_PORT, &GPIO_InitStructure);
}
void Ultra1_Ranging(float *p)
{
u8 i;
u32 j;
float Ultr_Temp;
for(i=0;i<3;i++)
{
TRIG1_Send=1;
delay_ms(10);
TRIG1_Send=0;
while(!ECHO1_Reci);
while(ECHO1_Reci)
{
delay_us(10);
j++;
}
Ultr_Temp+=340/2*j;//最大测距距离3m
j=0;
delay_ms(60);//防止发射信号对回响信号的影响
}
*p=Ultr_Temp/3/1000; //取三次平均值,减少误差cm
}
void Ultran2_Init(void)//后置超声波模块
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(ULTRA_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =ULTRA2_TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(ULTRA_PORT, &GPIO_InitStructure);
GPIO_ResetBits(ULTRA_PORT,ULTRA2_TRIG);
GPIO_InitStructure.GPIO_Pin =ULTRA2_ECHO;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(ULTRA_PORT, &GPIO_InitStructure);
}
void Ultra2_Ranging(float *p)
{
u8 i;
u32 j;
float Ultr_Temp;
for(i=0;i<3;i++)
{
TRIG2_Send=1;
delay_ms(10);
TRIG2_Send=0;
while(!ECHO2_Reci);
while(ECHO2_Reci)
{
delay_us(10);
j++;
}
Ultr_Temp+=340/2*j;
j=0;
delay_ms(60);
}
*p=Ultr_Temp/3/1000;
}
电机控制
1.#include "pwm.h"
void pwm_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//¹Ò½ÓÔÚAPB1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//СµÆµÄʱÖÓ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
TIM_TimeBaseStructure.TIM_Period = 900;//12.5us
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//µÆΪµÍµçƽÁÁÔòΪLOW
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//CCR1ԤװÔØʹÄÜ
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//CCR2ԤװÔØʹÄÜ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //¹Ü½Å£¬ÔÀíͼÖп´
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¹Ü½Å¹¤×÷״̬ .¸´ÓÃÍÆÍìÊä³ö
GPIO_Init(GPIOC,&GPIO_InitStructure);//¹Ò½ÓÔÚPC¶Ë¿ÚÔòÔÚC¶Ë¿Ú
TIM_Cmd(TIM3,ENABLE);//ʹÄÜ»òÕßʧÄÜTIMxÍâÉè
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(GPIOC,&GPIO_InitStructure);//¹Ò½ÓÔÚPC¶Ë¿ÚÔòÔÚC¶Ë¿Ú
GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_2);
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_3);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
}
2.#include "way.h"
void way_stop()
{ GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
}
void way_up()
{ GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_2);//Õýת
GPIO_ResetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_3);
}
void way_down()
{ GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_3);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_2);
}
void way_left()
{ GPIO_SetBits(GPIOC,GPIO_Pin_1);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);
}
void way_right()
{ GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_2); //ÓÒ±ßÏòºó£¬×ó±ßÏòÇ°
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_3);
}
主函数
int main()
{
float temp1,temp2;//距离
char DisNum[16];
SystemInit();
delay_init(72);
pwm_init();
Ultran1_Init();
Ultran2_Init();
way_up();
delay_ms(60);//要加一个延迟,以防止初始化过快导致误差
while(1)
{
Ultra1_Ranging(&temp1);//前置超声波
Ultra2_Ranging(&temp2);//后置超声波
if(temp1 > 50)//50cm
{ way_down();
}
if(temp2 > 50)
{ way_up();
}
}
}