欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STM32尋跡小車程序理解的問題
[打印本頁]
作者:
wanlong
時間:
2019-5-15 17:12
標題:
STM32尋跡小車程序理解的問題
這個是stm32尋跡控制輪子程序但是我到現(xiàn)在都沒讀懂他到底定義是哪四個io口,PA6,PA7 PB8,PB9,OR,PC6,PC7,PC8,PC9,求大神指點
#include "motor_control.h"
#include "SysTick.h"
#include "UltrasonicWave.h"
#include "pwm_output.h"
#include "usart1.h"
#define ONWARD 1
#define BACKWARD 0
extern vu8 count;
extern vu32 averge_distance;
vu8 left,right,middle;
vu32 S2;
vu32 S4;
vu32 S1;
vu32 timer;
//u16 Pwm_Right;
//u16 Pwm_Left;
/**************************************
函數(shù)名 :Control_GPIO_Config
函數(shù)描述:配置Control小車用到的I/O口
輸入?yún)?shù):無
輸出參數(shù):無
**************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIOA_InitStructure,GPIOB_InitStructure; //定義兩個GPIO_InitTypeDef類型的結(jié)構(gòu)體
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE);//開啟GPIOA外設時鐘
GPIOA_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //選擇要控制的GPIOA引腳
GPIOA_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設置引腳模式為推挽式輸出
GPIOA_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳速度為50Mhz
GPIO_Init(GPIOA,&GPIOA_InitStructure); //調(diào)用庫函數(shù)初始化 GPIOA
//剛開始停止電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9);
//RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); //開啟GPIOB的時鐘
GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //選擇要控制的GPIOB引腳
GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置引腳模式為推挽式輸出
GPIOB_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設置引腳速度為50MHz
GPIO_Init(GPIOC,&GPIOB_InitStructure); //調(diào)用初始化GPIOB
GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7); //啟動關閉電機
}
/*****************************************
函數(shù)名 : Control_GPIOE_Config
輸入描述 : 對傳感器輸入信號的管腳配置
輸入?yún)?shù) :無
輸出參數(shù) :無
******************************************/
void Control_GPIOE_Config(void)
{
GPIO_InitTypeDef GPIOB_InitStructure; //定義GPIOE管腳結(jié)構(gòu)體變量
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIOE外設時鐘
GPIOB_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_3|GPIO_Pin_4;
GPIOB_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //輸入采用浮空輸入
GPIO_Init(GPIOB,&GPIOB_InitStructure);
}
/********************************************
* 函數(shù)名 :TIM3_GPIO_Config
* 描述 :配置TIM3復用輸出PWM時用到的I/O
* 輸入 :無
* 輸出 :無
* 調(diào)用 :內(nèi)部調(diào)用
*********************************************/
void TIM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //配置GPIOC的管腳
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //開啟TIM3時鐘
/**配置pwm輸出的對應GPIO管腳****/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽式輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*****************************************************************************
*文件名 : TIM_Configuration
*描述 : TIM4 初始化
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
******************************************************************************/
void TIM3_Configuration(u16 CCR_Val_12,u16 CCR_Val_34)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//CCR_Val_12 = 900;
//CCR_Val_34 = 900;
/* -----------------------------------------------------------------------
TIM3 Configuration: generate 2 PWM signals with 2 different duty cycles:
TIM3CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
TIM3 ARR Register = 999 => TIM3 Frequency = TIM3 counter clock/(ARR + 1)
TIM3 Frequency = 36 KHz.
TIM3 Channel1 duty cycle = (CCR_Val_12/ TIM3_ARR)* 100 = 50%
TIM3 Channel1 duty cycle = (CCR_Val_34/ TIM3_ARR)* 100 = 50%
----------------------------------------------------------------------- */
/***通道1的配置*****/
TIM_TimeBaseStructure.TIM_Period = 999; //設定總周期值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設置預分頻:不預分頻,即為36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //設置時鐘分頻系數(shù):不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置為PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR_Val_12; //設置跳變值,當計數(shù)器計數(shù)到這個值時,電平發(fā)生跳變
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //當定時器計數(shù)值小于CCR_Val時為高電平
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR_Val_34; //設置通道3的電平跳變值,輸出另外一個占空比的PWM
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能通道2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
/***通道3的配置*****/
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重載寄存器ARR
TIM_Cmd(TIM3, ENABLE); //使能定時器3
// TIM_OC3Init(TIM3, &TIM_OCInitStructure); //使能通道3
// TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
// TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4
// TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
//
}
/*************壁障前進***********/
void Forward_run(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//0
GPIO_SetBits(GPIOC,GPIO_Pin_9);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_6);//0
GPIO_SetBits(GPIOC,GPIO_Pin_7);//1
}
/*************壁障后退***********/
void Backward_run(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
GPIO_SetBits(GPIOC,GPIO_Pin_8);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_9);//0
GPIO_SetBits(GPIOC,GPIO_Pin_6);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_7);//0
}
/*************壁障左轉(zhuǎn)***********/
void Left_turn(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
// GPIO_ResetBits(GPIOB,GPIO_Pin_1);//0 //右電機轉(zhuǎn)動
// GPIO_SetBits(GPIOB,GPIO_Pin_0);//1
GPIO_SetBits(GPIOC,GPIO_Pin_8); //左電機停止
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);//0 //右電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_7);//1
}
/*************壁障右轉(zhuǎn)***********/
void Right_turn(void)
{
/***右側(cè)停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(700,700);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//0 //左電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_9);//1
GPIO_SetBits(GPIOC,GPIO_Pin_6); //右電機停止
GPIO_SetBits(GPIOC,GPIO_Pin_7);
// GPIO_SetBits(GPIOB,GPIO_Pin_2);//1
// GPIO_ResetBits(GPIOB,GPIO_Pin_4);//0
}
/*************停止**********/
void Stop(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 0;
// Pwm_Right = 0;
TIM3_Configuration(0,0);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
}
/*************循跡前進***********/
void Xunji_Forward_run(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(400,400);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//0
GPIO_SetBits(GPIOC,GPIO_Pin_9);//1
GPIO_ResetBits(GPIOC,GPIO_Pin_6);//0
GPIO_SetBits(GPIOC,GPIO_Pin_7);//1
}
/*************循跡左轉(zhuǎn)***********/
void Xunji_Left_turn(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(400,400);
// GPIO_ResetBits(GPIOB,GPIO_Pin_1);//0 //右電機轉(zhuǎn)動
// GPIO_SetBits(GPIOB,GPIO_Pin_0);//1
GPIO_SetBits(GPIOC,GPIO_Pin_8); //左電機停止
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_ResetBits(GPIOC,GPIO_Pin_6);//0 //右電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_7);//1
}
/*************循跡右轉(zhuǎn)***********/
void Xunji_Right_turn(void)
{
/***右側(cè)停轉(zhuǎn)*/
// Pwm_Left = 900;
// Pwm_Right = 900;
TIM3_Configuration(400,400);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);//0 //左電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_9);//1
GPIO_SetBits(GPIOC,GPIO_Pin_6); //右電機停止
GPIO_SetBits(GPIOC,GPIO_Pin_7);
// GPIO_SetBits(GPIOB,GPIO_Pin_2);//1
// GPIO_ResetBits(GPIOB,GPIO_Pin_4);//0
}
/*************循跡停止***********/
void Xunji_Stop(void)
{
/*左側(cè)輪子停轉(zhuǎn)*/
// Pwm_Left = 0;
// Pwm_Right = 0;
TIM3_Configuration(400,400);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_6);
GPIO_SetBits(GPIOC,GPIO_Pin_7);
}
void COMM(void) //方向函數(shù)
{
Degree(20,1);
// TIM_SetCompare1(TIM2,11);
Delay_ms(700);
Average_Distance();
S2=averge_distance;
Degree(150,1);
// TIM_SetCompare1(TIM2,4);
Delay_ms(700);
Average_Distance();
S4=averge_distance;
Degree(85,1);
// TIM_SetCompare1(TIM2,8);
Delay_ms(700);
S1=averge_distance;
if(S2<30||S4<30) //只要左右各有距離小于20CM小車后退
{
Backward_run(); //后退
Delay_ms(700);
}
if(S2>S4)
{
Right_turn(); //車的左邊比車的右邊距離小,右轉(zhuǎn)
Delay_ms(700);
}
else
{
Left_turn(); //車的左邊比車的右邊距離大,左轉(zhuǎn)
Delay_ms(700);
}
}
/***************************************************
* 函數(shù)名 : Auto_run
* 描述 : 避障程序
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
****************************************************/
void Auto_run(void) //檢測障礙
{
Average_Distance();
if(averge_distance<30)
{
Stop();//小車停止
COMM(); //方向函數(shù)
}
else
{
if(averge_distance>30)
{
Forward_run();
}
}
}
/***************************************************
* 函數(shù)名 : 循跡程序
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
****************************************************/
void Xunji_run(void) //檢測障礙
{
//四路尋跡傳感器有信號(白線)為0 沒有信號(黑線)為1
if(Out1==0 && Out2==0&&Out3==0 &&Out4==0 )
{
Xunji_Forward_run();//實現(xiàn)小車的前進
}
else if(Out1==1 && Out2==0&&Out3==0 &&Out4==1 )
{
Xunji_Stop();//實現(xiàn)小車的停止
}
else if(Out1==0 && Out2==1&&Out3==1 &&Out4==0 )
{
Xunji_Forward_run();//實現(xiàn)小車的前進
}
else if(Out1==0 && Out2==1&&Out3==0 &&Out4==0 )
{
// TurnRight();//實現(xiàn)小車的左轉(zhuǎn)
Xunji_Left_turn();
}
else if(Out1==1 && Out2==0&&Out3==0 &&Out4==0 )
{
// TurnRight();//實現(xiàn)小車的左轉(zhuǎn)
Xunji_Left_turn();
}
else if(Out1==0 && Out2==0&&Out3==1 &&Out4==1 )
{
Xunji_Right_turn();//實現(xiàn)小車的前進
}
else if(Out1==0 && Out2==1&&Out3==1 &&Out4==1 )
{
// TurnRight();//實現(xiàn)小車的左轉(zhuǎn)
Xunji_Left_turn();
}
else if(Out1==0 && Out2==0&&Out3==0 &&Out4==1 )
{
// TurnLeft();//實現(xiàn)小車的右轉(zhuǎn)
Xunji_Right_turn();//實現(xiàn)小車的左轉(zhuǎn)
}
else if(Out1==0 && Out2==0&&Out3==1 &&Out4==0 )
{
// TurnLeft();//實現(xiàn)小車的右轉(zhuǎn)
Xunji_Right_turn();//實現(xiàn)小車的左轉(zhuǎn)
}
else if(Out1==1 && Out2==1&&Out3==0 &&Out4==0 )
{
// RunToForward();//實現(xiàn)小車的前進
Xunji_Left_turn();
}
else if(Out1==1 && Out2==1&&Out3==1 &&Out4==0 )
{
// TurnLeft();//實現(xiàn)小車的右轉(zhuǎn)
Xunji_Right_turn();//實現(xiàn)小車的左轉(zhuǎn)
}
else
{
Xunji_Stop();//實現(xiàn)小車的停止
}
}
復制代碼
作者:
wanlong
時間:
2019-5-19 16:38
沒有大佬解答一下嗎?
作者:
玉米里脊一粒
時間:
2019-6-25 13:53
6,7,8,9吧
作者:
葉春啊
時間:
2021-4-1 19:38
根據(jù)主板原理圖看接口
作者:
要精通
時間:
2023-3-22 20:26
請問你有完整的STM32尋跡小車程序嗎?
作者:
glinfei
時間:
2023-3-23 08:38
單單從這兩句看
//剛開始停止電機轉(zhuǎn)動
GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9);
顯然是讓 PC8和9 置高,但前邊又沒給GPIOC 初始化,所以不是你迷惑,是程序問題。
作者:
lihuajie32
時間:
2023-3-23 09:27
既然是pin 那就是唯一,看原理圖或芯片手冊
作者:
最后一個夏天1
時間:
2023-3-23 14:36
19年的帖子....,這是哪個大神找出來的
作者:
天ノ憶
時間:
2023-3-23 16:01
這程序讓我想起了我以前的同事,不光代碼跟注釋對不上號,變量的命名也跟操作的外設對不上號,配置跟思路那必然也是沒對上號。我接手他的程序簡直就像到了地獄
你這程序從結(jié)果上來看,開了GPIOB和GPIOC的時鐘,后面的TIM3函數(shù)里配置了GPIOA的時鐘,配置有效的是PA6,PA7,PB0,PB1PB3PB4,PC6,PC7,如果程序用的時候TIM_GPIO這個函數(shù)放在 GPIO_Configuration前面的話,PA8,PA9也是能用的
一句話,爛程序,不該出現(xiàn)在這個世界
謝謝樓主,讓我回憶起了地獄
作者:
要精通
時間:
2023-4-2 21:52
請問可以發(fā)一下電機驅(qū)動的代碼嗎
作者:
li64331218
時間:
2023-4-2 22:34
哈哈,這一看就是用別的程序改的。注釋沒有更改。根據(jù)GPIO 時鐘使能,應該是用C口的6、7、8、9來控制的。
作者:
哇哇哇哇阿松大
時間:
2023-4-3 14:49
應該是用C口的6、7、8、9
作者:
雪糕yya
時間:
2023-4-3 16:05
程序從結(jié)果上來看,開了GPIOB和GPIOC的時鐘,后面的TIM3函數(shù)里配置了GPIOA的時鐘,配置有效的是PA6,PA7,PB0,PB1PB3PB4,PC6,PC7,如果程序用的時候TIM_GPIO這個函數(shù)放在 GPIO_Configuration前面的話,PA8,PA9也是能用的
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1