基于STM32单片机制作三个超声波避障小车

避障小车项目:

我的代码是从舵机上一个超声波的避障小车代码和三个超声波测距在OLED显示的代码,更改的过来的。

然后就出现了一些问题,就是下载之后,只显示测距,驱动 和 直流电机 不会转 不知道啥情况,各位大神,能不能帮我看下,感谢感谢!!!


问题描述

只显示三个雷达测距测距,驱动 和 直流电机 不会工作做

mian,c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "HCSR04.h"
#include "Timer.h"
#include "Delay.h"
#include "MOTOR.h" 
#include "PWM.h"
#include "CAR.h"
#include "Serial.h"
 
uint16_t Data1; 
uint16_t L1;
uint16_t L2;
uint16_t L3;
int main(void)
{
    
    Car_Init();
    Serial_Init();
    OLED_Init();
    HCSR04_Init();
    
    OLED_ShowString(1, 1, "YOU:");
    OLED_ShowString(1, 8, "cm");
    OLED_ShowString(2, 1, "QIAN:");
    OLED_ShowString(2, 9, "cm");
    OLED_ShowString(3, 1, "ZUO:");
    OLED_ShowString(3, 8, "cm");
    while (1)
    {
        L1 = HCSR04_GetValue1();
        OLED_ShowNum(1, 5, L1, 3);
        L2 = HCSR04_GetValue2();
        OLED_ShowNum(2, 6, L2, 3);
        L3 = HCSR04_GetValue3();
        OLED_ShowNum(3, 5, L3, 3);
        Delay_ms(100);
                if((a>15)&&(b>15)&&(c>15))            //Ö±×ß
            {
                if(a>100)
                {
                    b = 460;
                    Delay_ms(80);
                }
                else
                {
                    Go_Ahead();
                    Delay_ms(200);
                }
                
            }
            else if(((c<b)&&(a<15)))        //×óת
            {
                Self_Left();
                Delay_ms(700);
                Go_Ahead();
            }
            else if(((b<c)&&(a<15)))        //ÓÒת
            {
                Self_Right();
                Delay_ms(700);
                Go_Ahead();
                
            }
            else if(b<15)                                //    ÓÒ΢µ÷
            {    
                Self_Right();
                Delay_ms(50);
            }
            
            else if(c<15)                                //    ×ó΢µ÷
            {    
                Self_Left();
                Delay_ms(50);
            }
        }
}

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        Data1=USART_ReceiveData(USART1);
        if(Data1==0x30)Car_Stop();
        if(Data1==0x31)Go_Ahead();
        if(Data1==0x32)Go_Back();
        if(Data1==0x33)Turn_Left();
        if(Data1==0x34)Turn_Right();
        if(Data1==0x35)Self_Left();
        if(Data1==0x36)Self_Right();
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

HC-SR04.C
   #include "stm32f10x.h"                  // Device header
#include "HCSR04.h"
#include "Timer.h"
#include "Delay.h"
 
uint16_t Time1;
uint16_t Time2;
uint16_t Time3;
void HCSR04_Init()//每个超声波的T,E脚初始化
{
    RCC_APB2PeriphClockCmd(Trig_RCC1, ENABLE);
    RCC_APB2PeriphClockCmd(Trig_RCC2, ENABLE);
    RCC_APB2PeriphClockCmd(Trig_RCC3, ENABLE);
    GPIO_InitTypeDef GPIO_InitStruct;
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = Trig_Pin1;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Trig_Port1, &GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStruct.GPIO_Pin = Echo_Pin1;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Echo_Port1, &GPIO_InitStruct);
/****/
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = Trig_Pin2;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Trig_Port2, &GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStruct.GPIO_Pin = Echo_Pin2;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Echo_Port2, &GPIO_InitStruct);
/***********/
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin = Trig_Pin3;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Trig_Port3, &GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStruct.GPIO_Pin = Echo_Pin3;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Echo_Port3, &GPIO_InitStruct);    
    
    GPIO_ResetBits(Trig_Port1, Trig_Pin1);
    GPIO_ResetBits(Trig_Port2, Trig_Pin2);
    GPIO_ResetBits(Trig_Port3, Trig_Pin3);
}
 
 
uint16_t HCSR04_GetValue1()//超声波1
{
    GPIO_SetBits(Trig_Port1, Trig_Pin1);
    Delay_us(45);//为了超声波能完全发出
    GPIO_ResetBits(Trig_Port1, Trig_Pin1);
    Timer_Init();
    Delay_ms(80);
    return ((Time1 * 0.0001) * 34000) / 2;//计算距离定时器计数*每次计数时间*声速/2
}
 
/**************************************/
 
uint16_t HCSR04_GetValue2()//超声波2
{
    GPIO_SetBits(Trig_Port2, Trig_Pin2);
    Delay_us(45);
    GPIO_ResetBits(Trig_Port2, Trig_Pin2);
    Timer_Init();
    Delay_ms(80);
    return ((Time2 * 0.0001) * 34000) / 2;
}
 
/************************************/
uint16_t HCSR04_GetValue3()//超声波3
{
    GPIO_SetBits(Trig_Port3, Trig_Pin3);
    Delay_us(45);
    GPIO_ResetBits(Trig_Port3, Trig_Pin3);
    Timer_Init();
    Delay_ms(80);
    return ((Time3 * 0.0001) * 34000) / 2;
}
/************************************/PWM.C
#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM4);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;        //ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;        //PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;        //CCR
    //PWM接口的占空比越大,速度越小
    TIM_OC1Init(TIM4, &TIM_OCInitStructure); //设置PWM通道的占空比
    TIM_OC2Init(TIM4, &TIM_OCInitStructure);
 
    
    TIM_Cmd(TIM4, ENABLE);
}
 
void PWM_SetCompare1(uint16_t Compare)    //设置CCR寄存器的值
{
    TIM_SetCompare1(TIM4, Compare);
}
 
void PWM_SetCompare2(uint16_t Compare)
{
    TIM_SetCompare2(TIM4, Compare);
}
 
 CAR.c
      #include "stm32f10x.h"                  // Device header
#include "Motor.h"
#include "Delay.h"
void Car_Init(){
    Motor_Init();
}
void Go_Ahead(){
    Motor_SetLeftSpeed(70);
    Motor_SetRightSpeed(-70);
}
void Go_Back(){
    Motor_SetLeftSpeed(-70);
    Motor_SetRightSpeed(70);
}
void Turn_Left(){
    Motor_SetLeftSpeed(0);
    Motor_SetRightSpeed(-70);
}
void Turn_Right(){
    Motor_SetRightSpeed(0);
    Motor_SetLeftSpeed(70);
    
}
void Self_Left(){
    Motor_SetLeftSpeed(-70);
    Motor_SetRightSpeed(-70);
}
void Self_Right(){
    Motor_SetLeftSpeed(70);
    Motor_SetRightSpeed(70);
}
void Car_Stop(){
    Motor_SetLeftSpeed(0);
    Motor_SetRightSpeed(0);
}MOTOR.C
#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    PWM_Init();
}

void Motor_SetLeftSpeed(int8_t Speed)
{
    if (Speed >0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
        GPIO_ResetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare1(Speed);
    }
    else if(Speed==0){
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
        GPIO_SetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare1(Speed);
    }else{
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
        GPIO_SetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare1(-Speed);
    }
}
void Motor_SetRightSpeed(int8_t Speed)
{
    if (Speed >0)
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
        GPIO_ResetBits(GPIOA, GPIO_Pin_7);
        PWM_SetCompare2(Speed);
    }
    else if(Speed==0){
        GPIO_SetBits(GPIOA, GPIO_Pin_6);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
        PWM_SetCompare2(Speed);
    }else{
        GPIO_ResetBits(GPIOA, GPIO_Pin_6);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
        PWM_SetCompare2(-Speed);
    }
}Serial,c
#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

void Serial_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//RX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_Init(USART1, &USART_InitStructure);
    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_Cmd(USART1, ENABLE);
}

void Serial_SendByte(uint8_t Byte)
{
    USART_SendData(USART1, Byte);
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
    uint16_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Array[i]);
    }
}

void Serial_SendString(char *String)
{
    uint8_t i;
    for (i = 0; String[i] != '\0'; i ++)
    {
        Serial_SendByte(String[i]);
    }
}

uint32_t Serial_Pow(uint32_t X, uint32_t Y)
{
    uint32_t Result = 1;
    while (Y --)
    {
        Result *= X;
    }
    return Result;
}

void Serial_SendNumber(uint32_t Number, uint8_t Length)
{
    uint8_t i;
    for (i = 0; i < Length; i ++)
    {
        Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0');
    }
}

int fputc(int ch, FILE *f)
{
    Serial_SendByte(ch);
    return ch;
}

void Serial_Printf(char *format, ...)
{
    char String[100];
    va_list arg;
    va_start(arg, format);
    vsprintf(String, format, arg);
    va_end(arg);
    Serial_SendString(String);

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值