防坠落智能小车

智能小车

防坠落智能小车

心得:硬件设计需要细心,特别要注意各引脚和时钟的关系。有时候在两个不同头文件重复定义的相同引脚,会导致功能失效。另外可以用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();
        }    
}

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值