摘要:前言傳感器工作原理代碼部分電機(jī)初始化延遲初始化電機(jī)管腳初始化尋跡管腳初始化。電機(jī)管腳初始化函數(shù)定義管腳的結(jié)構(gòu)體打開(kāi)所要使用的時(shí)鐘將管腳特殊功能關(guān)掉配置管腳的參數(shù),用于驅(qū)動(dòng)電機(jī)。配置管腳的參數(shù)紅外傳感器。
前言:傳感器工作原理:
代碼部分:?
?
main.c
#include "motor.h"#include #include "delay.h"#include "stm32f10x.h"#include "followline.h"#include "ultrasonic.h"u8 UART3_data,UART1_data;u8 UART3_rcv[20],UART3_rcv_count;u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;int main(void){ motor_pwm_TIME4_init(71,999);//電機(jī)PWM初始化 delay_init();//延遲初始化 motor_GPIO_init();//電機(jī)管腳初始化、尋跡管腳初始化。 //int right_2=0,right_1=0 ,left_2=0,left_1=0; while(1) { Car_fllow(); }}
motor.c
#include "motor.h"http://電機(jī)GPIO管腳初始化函數(shù)/**********************************************************************************/void motor_GPIO_init(void){ //定義管腳的結(jié)構(gòu)體 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct_C,GPIO_InitStruct_B; //打開(kāi)所要使用的時(shí)鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //將管腳PB4特殊功能關(guān)掉 GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); //配置PB4/5/8/9管腳的參數(shù),用于驅(qū)動(dòng)電機(jī)。 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //配置PC13/14/15管腳的參數(shù),紅外傳感器。 GPIO_InitStruct_C.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct_C.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_15|GPIO_Pin_13; 配置PB12管腳的參數(shù),紅外傳感器。 GPIO_InitStruct_B.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStruct_B.GPIO_Pin=GPIO_Pin_12; //初始化PB4/5/8/9的管腳 GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_Init(GPIOC, &GPIO_InitStruct_C); GPIO_Init(GPIOB, &GPIO_InitStruct_B); //配置PB6/7管腳的參數(shù),用于產(chǎn)生PWM波 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //初始化PB6/7的管腳 GPIO_Init(GPIOB, &GPIO_InitStruct); //管腳全部先置零 GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5); }/***************************************************************************************************************///TIME4的初始化函數(shù)/********************************************************************************************/void motor_pwm_TIME4_init(int presc,int arr){ //定義定時(shí)器的結(jié)構(gòu)體 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定義定時(shí)器PWM輸出通道的結(jié)構(gòu)體 TIM_OCInitTypeDef TIM_OCInitStruct; //打開(kāi)TIME4的時(shí)鐘 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //配置TIME4結(jié)構(gòu)體的參數(shù) TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Prescaler = presc; TIM_TimeBaseInitStruct.TIM_Period =arr; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStruct); //配置TIME4通道結(jié)構(gòu)體的參數(shù) TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ; TIM_OCInitStruct.TIM_Pulse =0; //TIME4通道1初始化 TIM_OC1Init(TIM4, &TIM_OCInitStruct); //使能TIME4通道1的預(yù)存寄存器 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //TIME4通道2初始化 TIM_OC2Init(TIM4, &TIM_OCInitStruct); //使能TIME4通道2的預(yù)存寄存器 TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIME4 TIM_Cmd(TIM4, ENABLE);}/*******************************************************************************************************/void Car_gostright(int speed)//直行函數(shù) { speed_left(speed); speed_right(speed); GPIO_SetBits(GPIOB, GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB, GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5); }void Car_back(int speed)//后退{(lán) speed_left(speed); speed_right(speed); GPIO_SetBits(GPIOB,GPIO_Pin_8);//左邊電機(jī) GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右邊電機(jī) GPIO_SetBits(GPIOB,GPIO_Pin_5);}void Car_left(int speed_left,int speed_right)//小車(chē)左轉(zhuǎn){ speed_left(speed_left); speed_right(speed_right); GPIO_ResetBits(GPIOB, GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_SetBits(GPIOB, GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5);}void Car_right(int speed_left1,int speed_right1)//小車(chē)右轉(zhuǎn){ speed_left(speed_left1); speed_right(speed_right1); GPIO_SetBits(GPIOB, GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_8); GPIO_ResetBits(GPIOB, GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5);} void Car_stop(void){ GPIO_ResetBits(GPIOB,GPIO_Pin_8);//左邊電機(jī) GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_4);//右邊電機(jī) GPIO_ResetBits(GPIOB,GPIO_Pin_5);}void Cra_left_revolve(int speed_left2,int speed_right2)//小車(chē)左直角轉(zhuǎn)彎{ speed_left(speed_left2); speed_right(speed_right2); GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右邊電機(jī)前進(jìn) 8=0,9=1 GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左邊電機(jī)后退4=0,5=1 GPIO_SetBits(GPIOB,GPIO_Pin_5);} void Cra_right_revolve(int speed_left3,int speed_right3)//小車(chē)右直角轉(zhuǎn)彎{ speed_left(speed_left3); speed_right(speed_right3); GPIO_ResetBits(GPIOB,GPIO_Pin_8);//右邊電機(jī)前進(jìn) 8=0,9=1 GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_4);//左邊電機(jī)后退4=0,5=1 GPIO_SetBits(GPIOB,GPIO_Pin_5);} //延遲一秒函數(shù)/****************************************************************************************************************/void delay_s(int s){ for(;s>0;s--) { delay_ms(1000); }}/****************************************************************************************************************/
motor.h
#ifndef __MOTOR_H__#define __MOTOR_H__//需要調(diào)用的庫(kù)#include "stm32f10x_rcc.h"#include "stm32f10x_gpio.h"#include "stm32f10x_tim.h"#include "delay.h"http://宏定義#define PERIOD 10 //周期為10ms,頻率為1Khz#define speed_left(speed) {TIM_SetCompare2(TIM4, speed);}#define speed_right(speed) {TIM_SetCompare1(TIM4, speed);}//自定義的函數(shù)void motor_GPIO_init(void);void motor_pwm_TIME4_init(int presc,int arr);void Car_stop(void);void Car_gostright(int speed);//小車(chē)直走void Car_back(int speed);//小車(chē)后退void Car_left(int speed_left,int speed_right);//小車(chē)左轉(zhuǎn)void Car_right(int speed_left1,int speed_right1);//小車(chē)右轉(zhuǎn)void Cra_left_revolve(int speed_left2,int speed_right2);//小車(chē)原地左轉(zhuǎn)void Cra_right_revolve(int speed_left2,int speed_right2);//小車(chē)原地右轉(zhuǎn)void Car_fllow(void);void delay_s(int s);#endif
follow.c
#include "followline.h"#include "motor.h"void Car_fllow(void){ while(1) { int L1=1,L2=1,R1=1,R2=1; L1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13); L2=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14); R1=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15); R2=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12); if(L1==1&&L2==0&&R1==0&&R2==1)//直行 { Car_gostright(250); delay_ms(80); } else if((L1==1&&R1==1 )||(R1==1))//左轉(zhuǎn) { Car_left(0,250); delay_ms(80); } else if((L1==1&&L2==1&&R1==0&&R2==1)||(L1==1))//右轉(zhuǎn) { Car_right(250,0); delay_ms(80); } else if((L1==0&&L2==0&&R1==0&&R2==1)||(L2==0&&R2==1))//左直角轉(zhuǎn)彎 { Cra_left_revolve(250,250); delay_ms(80); } else if((L1==1&&L2==0&&R1==0&&R2==0)||(R2==0&&L2==1))//右直角轉(zhuǎn)彎 { Cra_right_revolve(250,250); delay_ms(80); } else if(L1==1&&L2==1&&R1==1&&R2==1)//左直角轉(zhuǎn)彎 { Cra_right_revolve(250,250); delay_ms(80); } else { Car_gostright(250); delay_ms(80); } }}
?follow.h
#ifndef __FOLLOWLINE_H__#define __FOLLOWLINE_H__#include "stm32f10x_gpio.h"http://讀取四個(gè)傳感器的值#define right_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)#define right_1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_15)#define left_2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)#define left_1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)void followline_gpio_init(void);void Car_fllow(void);//void followline_function(int conut1,int count2); #endif
寫(xiě)在最后?。?!一般邏輯沒(méi)問(wèn)題,主要調(diào)試參數(shù),不要一直修改程序邏輯, 調(diào)調(diào)傳感器靈敏度啊,或則改改速度啊。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119236.html
基于STM32f103c8t6和L292N驅(qū)動(dòng)設(shè)計(jì)避障小車(chē)(核心函數(shù)的建立為自己所寫(xiě)) 一.項(xiàng)目感觸 完成這個(gè)項(xiàng)目自己一開(kāi)始也是無(wú)法從本身上出發(fā),看著這個(gè)最小系統(tǒng)板和這個(gè)電機(jī)驅(qū)動(dòng)模塊上面想著怎樣實(shí)現(xiàn)讓這兩塊板子實(shí)現(xiàn)四個(gè)電機(jī)上面轉(zhuǎn)動(dòng)呢,還要加入避障模塊,自己一開(kāi)始一頭霧水,于是開(kāi)始了漫長(zhǎng)的借鑒之路,首先作為一個(gè)開(kāi)發(fā)者,我覺(jué)得學(xué)習(xí)的地方首選是B站,所以我找了相關(guān)的做智能小車(chē)的視頻 首先是B站智能小車(chē)教...
摘要:灰度傳感器利用不同顏色的檢測(cè)面對(duì)光的反射程度不同的原理進(jìn)行顏色深淺檢測(cè)。這就是我們用的數(shù)字量灰度傳感器。數(shù)字量的灰度傳感器如果加入的是單片機(jī)處理數(shù)據(jù),那么可以把得到的原始數(shù)據(jù)加入濾波算法數(shù)據(jù)混合算法得到一個(gè)波動(dòng)小適應(yīng)環(huán)境強(qiáng)的數(shù)字傳感器。 文章目錄 引言 1.尋跡傳感器工作原理介紹 2.使用方...
摘要:文章目錄一原理二實(shí)現(xiàn)顯示中文滾動(dòng)顯示顯示字符串讀取溫濕度顯示溫濕度三結(jié)果開(kāi)機(jī)顯示歡迎信息循環(huán)讀取溫濕度以及滾動(dòng)顯示我的四總結(jié)五參考六源碼一原理的定義就是串行外圍設(shè)備接口。 ...
摘要:一直以來(lái),都想自己一個(gè)平衡小車(chē),但是由于種種原因,擔(dān)心自己無(wú)法做好沒(méi)有時(shí)間去做等等,這件事也就一拖再拖。網(wǎng)上也有很多現(xiàn)成的套件,如果怕麻煩,可購(gòu)買(mǎi)整件。 一直以來(lái),...
摘要:帶中文字庫(kù)的是一種具有位位并行線(xiàn)或線(xiàn)串行多種接口方式,內(nèi)部含有國(guó)標(biāo)一級(jí)二級(jí)簡(jiǎn)體中文字庫(kù)的點(diǎn)陣圖形液晶顯示模塊其顯示分辨率為。貼片按鍵模塊支持標(biāo)準(zhǔn)的協(xié)議,完整的協(xié)議棧。以最低成本提供最大實(shí)用性,為功能嵌入其他系統(tǒng)提供無(wú)限可能。 項(xiàng)目簡(jiǎn)介 開(kāi)發(fā)環(huán)境: Keil5.14,CubeMX6.0.1,主...
閱讀 2664·2021-11-25 09:43
閱讀 683·2021-11-12 10:36
閱讀 4654·2021-11-08 13:18
閱讀 2194·2021-09-06 15:00
閱讀 3127·2019-08-30 15:56
閱讀 946·2019-08-30 13:57
閱讀 2002·2019-08-30 13:48
閱讀 1425·2019-08-30 11:13