避障小车项目:
我的代码是从舵机上一个超声波的避障小车代码和三个超声波测距在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);