功能介紹放開頭, 使用便捷無需愁。
這是全網最詳細、性價比最高的STM32實戰項目入門教程,通過合理的硬件設計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學習,通過3萬字筆記、12多個小時視頻、20多章節代碼手把手教會你如何開發和調試。讓你更快掌握嵌入式系統開發。
V1.5.0-STM32智能小車
V1.5.0:庫函數開發。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。
視頻合集鏈接推薦觀看
[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]
**V3.3.0-STM32智能小車 **
V3:HAL庫開發、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。
視頻合集鏈接推薦觀看
[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]
舵機控制
查看原理圖
芯片手冊
使用上節移植的定時器三例程
不需要開啟部分重映射,
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5
初始化函數為
//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預分頻數
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能對應時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//使能GPIO外設和AFIO復用功能模塊時鐘
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5
//設置該引腳為復用輸出功能,輸出TIM3 CH1的PWM脈沖波形 GPIOA.6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //設置在下一個更新事件裝入活動的自動重裝載寄
存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設置用來作為TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中
指定的參數初始化TIMx的時間基數單位
//初始化TIM3 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調
制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比
較極性高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根據T指定的參數初始化外設TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的預裝載寄
存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
讓舵機搖搖頭
調用初始化函數和改變占空比
TIM3_PWM_Init(999,1439); //時鐘源為72MHZ 故72 000 000 /
(1439+1)/(999+1)=50HZ
TIM_SetCompare1(TIM3,32); //舵機向右
delay_ms(900);
TIM_SetCompare1(TIM3,80); //舵機向前
delay_ms(900);
TIM_SetCompare1(TIM3,130); //舵機向左
delay_ms(900);
然后
按鍵與紅外對管
按鍵外部中斷實驗
讓我們先實現按鍵控制燈的亮滅
查看原理圖
這里發現翻車,嗚嗚嗚
由于C8T6小板子的PA12接了上拉電阻,所以使用PA12的時候要注意。而且如果我們用Mrico USB供電
可能會影響PA11。
現在我們的原理圖是這樣的 KEY1-PA7 KEY2-PA12
配置按鍵端口模式
通過原理圖知:KEY1(PA7)應該配置成下拉輸入、上升沿觸發。
KEY2(PA12)應該配置成上拉輸入、下降沿觸發。
//按鍵初始化函數
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA7設置成輸入,默認下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.12
}
配置中斷線和配置外部通道
//KEY外部中斷服務程序
void KEY_EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init(); // 按鍵端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復用功能時鐘
//GPIOA.7 中斷線以及中斷初始化配置 上升沿觸發 PA7 KEY_1
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource7); //選擇GPIO引腳作為
中斷線
EXTI_InitStructure.EXTI_Line=EXTI_Line7; //線路選擇
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //事件選擇
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //觸發模式 上升沿觸發
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設
EXTI寄存器
//GPIOA.5 中斷線以及中斷初始化配置 下降沿觸發PA12 KEY_2
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource12);
EXTI_InitStructure.EXTI_Line=EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發
EXTI_Init(&EXTI_InitStructure); //根據EXTI_InitStruct中指定的參數初始化外設
EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按鍵KEY1所在
的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子
優先級1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設
NVIC寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按鍵KEY0
所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子
優先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據NVIC_InitStruct中指定的參數初始化外設
NVIC寄存器
}
相關宏定義 讀取按鍵狀態
#define KEY_1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)//讀取按鍵KEY_1
#define KEY_2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)//讀取按鍵KEY_2
編寫響應中斷函數
void EXTI9_5_IRQHandler(void)//按鍵KEY_1 和KEY_2的中斷服務函數
{
delay_ms(10);//消抖
if(KEY_1 == 1) //判斷按鍵KEY_1 是否被按下
{
LED =! LED;
EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE7上的中斷標志位
}
}
void EXTI15_10_IRQHandler(void)//按鍵KEY_SW1 和KEY_SW2的中斷服務函數
{
delay_ms(10);//消抖
if(KEY_2 == 0) //判斷按鍵KEY_2 是否被按下
{
LED =! LED;
EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE7上的中斷標志位
}
}
調用初始化函數
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先
級,2位響應優先級
//如果沒有設置中斷優先級分組要先設置
KEY_EXTIX_Init(); //初始化外部中斷輸入
燒錄調試
觀察現象
紅外對管硬件使用方法
詳見:系統硬件設計->紅外循跡模塊
可以把紅外對管看成'按鍵',當前面有黑色時候為高電平,前面白色低電平。
紅外對管的驅動
紅外對管這里使用查詢的方式,通過GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t *
GPIO_Pin)函數獲得對應端口的電平
查看原理圖 紅外對管依次連接 PB5 、PB4 、PB3 、PA15
紅外管GPIO初始化
注意:這里我們需要使用的PB3、PB4、PA15是單片機的'特殊引腳
我們打開數據手冊:STM32F103x8B_DS_CH_V10,在引腳定義章節,說明了復位后的主功能和默認復
用功能以及重定義功能。
在參考手冊:STM32中文參考手冊_V10, 在8.3.5 JTAG/SWD復用功能重映射中,說明了引腳使用
所以我們需要關閉JTAG-DP 啟用SW-DP ,我們重映射配置應寫為
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//紅外循跡TCRT5000初始化函數
void TCRT5000_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使
能PORTA,PORTB時鐘
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//重映射配置關閉JTAG-DP 啟用SW-DP從而可以使用PA15 PB3 PB4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA15 設置成下拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 設置成下拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB 5 4 3
}
一些宏定義,利用函數讀取電平
#define HW_1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)//讀取 PB5 電平
#define HW_2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)//讀取 PB4
#define HW_3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)//讀取 PB3
#define HW_4 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)//讀取 PA15
調用初始化函數
TCRT5000_Init();
紅外對管控制小燈
while(1){
if(HW_1 == 1 && HW_2==0 && HW_3 == 1 && HW_4 == 0 )//當第一個和第三
個前面是黑色時候板子小燈亮,其他情況板子小燈滅
{
LED =0;
}
else{
LED =1;
}
}
練一練--紅外對管循跡
while(1)
{
if(HW_1 == 0 && HW_2 == 0 && HW_3 == 0 && HW_4 == 0)
{
Forward();
delay_ms(50);
}
if(HW_1 == 0 && HW_2 == 1 && HW_3 == 0 && HW_4 == 0)
{
Rightward();
delay_ms(150);
}
if(HW_1 == 1 && HW_2 == 0 && HW_3 == 0 && HW_4 == 0)
{
Rightward();
delay_ms(250);
}
if(HW_1 == 1 && HW_2 == 1 && HW_3 == 0 && HW_4 == 0)
{
Rightward();
delay_ms(300);
}
if(HW_1 == 0 && HW_2 == 0 && HW_3 == 1 && HW_4 == 0)
{
Leftward();
delay_ms(150);
}
if(HW_1 == 0 && HW_2 == 0 && HW_3 == 0 && HW_4 == 1)
{
Leftward();
delay_ms(250);
}
if(HW_1 == 0 && HW_2 == 0 && HW_3 == 1 && HW_4 == 1)
{
Leftward();
delay_ms(300);
}
}
審核編輯 黃宇
-
STM32
+關注
關注
2290文章
11017瀏覽量
362476 -
PWM控制
+關注
關注
7文章
195瀏覽量
26991 -
舵機
+關注
關注
17文章
294瀏覽量
41719 -
SG90
+關注
關注
0文章
9瀏覽量
11619
發布評論請先 登錄
STM32 CubeIDE 模擬舵機sg90控制 精選資料分享
控制舵機SG90的教程
STM32驅動SG90舵機的方法
STM32—TIM3輸出PWM信號驅動MG996R舵機(按鍵控制)

STM32控制SG90舵機教程(180度和360度)

STM32驅動SG90舵機

評論