衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

第四章-V1.5 舵機 舵機角度控制 PWM控制紅外對管和按鍵控制 STM32驅(qū)動舵機控制 SG90控制

STM32智能小車V1.5 ? 來源:dfhjgfg ? 作者:dfhjgfg ? 2024-08-15 16:20 ? 次閱讀

功能介紹放開頭, 使用便捷無需愁。

這是全網(wǎng)最詳細、性價比最高的STM32實戰(zhàn)項目入門教程,通過合理的硬件設(shè)計和詳細的視頻筆記介紹,硬件使用STM32F103主控資料多方便學(xué)習(xí),通過3萬字筆記、12多個小時視頻、20多章節(jié)代碼手把手教會你如何開發(fā)和調(diào)試。讓你更快掌握嵌入式系統(tǒng)開發(fā)。

V1.5.0-STM32智能小車

V1.5.0:庫函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。

視頻合集鏈接推薦觀看

[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]

**V3.3.0-STM32智能小車 **

V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。

視頻合集鏈接推薦觀看

[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]

舵機控制

查看原理圖

在這里插入圖片描述

芯片手冊

在這里插入圖片描述
使用上節(jié)移植的定時器三例程
在這里插入圖片描述
不需要開啟部分重映射,

//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5

初始化函數(shù)為

//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動重裝值
//psc:時鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能對應(yīng)時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時器3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//使能GPIO外設(shè)和AFIO復(fù)用功能模塊時鐘
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH1的PWM脈沖波形 GPIOA.6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄
存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中
指定的參數(shù)初始化TIMx的時間基數(shù)單位
//初始化TIM3 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調(diào)
制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比
較極性高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的預(yù)裝載寄
存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}

讓舵機搖搖頭

調(diào)用初始化函數(shù)和改變占空比

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);

然后

按鍵與紅外對管

按鍵外部中斷實驗

讓我們先實現(xiàn)按鍵控制燈的亮滅

查看原理圖

這里發(fā)現(xiàn)翻車,嗚嗚嗚
在這里插入圖片描述
由于C8T6小板子的PA12接了上拉電阻,所以使用PA12的時候要注意。而且如果我們用Mrico USB供電
可能會影響PA11。
現(xiàn)在我們的原理圖是這樣的 KEY1-PA7 KEY2-PA12
在這里插入圖片描述

配置按鍵端口模式

通過原理圖知:KEY1(PA7)應(yīng)該配置成下拉輸入、上升沿觸發(fā)。
KEY2(PA12)應(yīng)該配置成上拉輸入、下降沿觸發(fā)。

//按鍵初始化函數(shù)
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設(shè)置成輸入,默認下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.12
}

配置中斷線和配置外部通道

//KEY外部中斷服務(wù)程序
void KEY_EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
KEY_Init(); // 按鍵端口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能復(fù)用功能時鐘
//GPIOA.7 中斷線以及中斷初始化配置 上升沿觸發(fā) 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; //觸發(fā)模式 上升沿觸發(fā)
EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)
EXTI寄存器
//GPIOA.5 中斷線以及中斷初始化配置 下降沿觸發(fā)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; //下降沿觸發(fā)
EXTI_Init(&EXTI_InitStructure); //根據(jù)EXTI_InitStruct中指定的參數(shù)初始化外設(shè)
EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //使能按鍵KEY1所在
的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子
優(yōu)先級1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)
NVIC寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按鍵KEY0
所在的外部中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子
優(yōu)先級0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)
NVIC寄存器
}

相關(guān)宏定義 讀取按鍵狀態(tài)

#define KEY_1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)//讀取按鍵KEY_1
#define KEY_2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_12)//讀取按鍵KEY_2

編寫響應(yīng)中斷函數(shù)

void EXTI9_5_IRQHandler(void)//按鍵KEY_1 和KEY_2的中斷服務(wù)函數(shù)
{
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的中斷服務(wù)函數(shù)
{
delay_ms(10);//消抖
if(KEY_2 == 0) //判斷按鍵KEY_2 是否被按下
{
LED =! LED;
EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE7上的中斷標志位
}
}

調(diào)用初始化函數(shù)

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先
級,2位響應(yīng)優(yōu)先級
//如果沒有設(shè)置中斷優(yōu)先級分組要先設(shè)置
KEY_EXTIX_Init(); //初始化外部中斷輸入

燒錄調(diào)試

觀察現(xiàn)象

紅外對管硬件使用方法

詳見:系統(tǒng)硬件設(shè)計->紅外循跡模塊
可以把紅外對管看成'按鍵',當前面有黑色時候為高電平,前面白色低電平。

紅外對管的驅(qū)動

紅外對管這里使用查詢的方式,通過GPIO_ReadInputDataBit(GPIO_TypeDef GPIOx, uint16_t *
GPIO_Pin)函數(shù)獲得對應(yīng)端口的電平
查看原理圖 紅外對管依次連接 PB5 、PB4 、PB3 、PA15
在這里插入圖片描述

紅外管GPIO初始化

注意:這里我們需要使用的PB3、PB4、PA15是單片機的'特殊引腳
我們打開數(shù)據(jù)手冊:STM32F103x8B_DS_CH_V10,在引腳定義章節(jié),說明了復(fù)位后的主功能和默認復(fù)
用功能以及重定義功能。
在這里插入圖片描述
在參考手冊:STM32中文參考手冊_V10, 在8.3.5 JTAG/SWD復(fù)用功能重映射中,說明了引腳使用
在這里插入圖片描述
所以我們需要關(guān)閉JTAG-DP 啟用SW-DP ,我們重映射配置應(yīng)寫為

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//紅外循跡TCRT5000初始化函數(shù)
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);
//重映射配置關(guān)閉JTAG-DP 啟用SW-DP從而可以使用PA15 PB3 PB4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA15 設(shè)置成下拉輸入
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; // 設(shè)置成下拉輸入
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB 5 4 3
}

一些宏定義,利用函數(shù)讀取電平

#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

調(diào)用初始化函數(shù)

TCRT5000_Init();

紅外對管控制小燈

while(1){
if(HW_1 == 1 && HW_2==0 && HW_3 == 1 && HW_4 == 0 )//當?shù)谝粋€和第三
個前面是黑色時候板子小燈亮,其他情況板子小燈滅
{
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);
}
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10923

    瀏覽量

    357575
  • PWM控制
    +關(guān)注

    關(guān)注

    7

    文章

    194

    瀏覽量

    26458
  • 舵機
    +關(guān)注

    關(guān)注

    17

    文章

    280

    瀏覽量

    41193
  • SG90
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    11533
收藏 人收藏

    評論

    相關(guān)推薦

    51控制SG90舵機的電源問題

    用51控制SG90舵機節(jié)干電池供電,出現(xiàn)電壓不足問題,程序跑亂,請問這要怎么解決呀?
    發(fā)表于 04-14 11:54

    如何利用51單片機去控制SG90舵機

    SG90舵機是如何進行接線的?SG90舵機旋轉(zhuǎn)的角度有哪幾種?如何利用51單片機去控制
    發(fā)表于 07-29 07:50

    STM32 CubeIDE 模擬舵機sg90控制 精選資料分享

    ,比如sg90,不帶限位,如果控制不合理,那么就會出現(xiàn)旋轉(zhuǎn)360的結(jié)果。使用sg90舵機測試,這個舵機的三根線分別為:GND(棕色)、VCC
    發(fā)表于 08-10 06:15

    控制舵機SG90的教程

    目錄前言一、SG90舵機二、CubeMax配置1.選型2.配置時鐘樹3.PWM相關(guān)定時器配置4.生成代碼三、代碼編寫總結(jié)前言這是一篇基于STM32F429的保姆級入門的用CubeMAX
    發(fā)表于 08-10 06:05

    如何去實現(xiàn)基于STM32F103ZET的SG90舵機控制

    什么是SG90舵機?模擬舵機與數(shù)字舵機有哪些區(qū)別呢?如何去實現(xiàn)基于STM32F103ZET的SG90
    發(fā)表于 11-19 07:27

    如何使用stm32Cubemx軟件配置PWM控制SG90舵機角度

    如何使用stm32Cubemx軟件配置PWM控制SG90舵機角度
    發(fā)表于 12-02 06:45

    如何利用STM32F103控制SG90舵機

    如何利用STM32F103控制SG90舵機
    發(fā)表于 12-14 07:18

    如何使用stm32Cubemx軟件配置PWM控制SG90舵機角度

    stm32Cubemx(一):PWM控制SG90舵機本章將介紹使用stm32Cubemx軟件配置
    發(fā)表于 01-21 08:00

    STM32驅(qū)動SG90舵機的方法

    的,實際上在某寶購買的時候360°、180°、90°的SG90都叫這個名字,如果你真的不懂的話,選購之前最好是問問客服可以旋轉(zhuǎn)多少度。杜邦線若干。2.接線方法主要是SG90舵機的三根線
    發(fā)表于 02-21 06:54

    STM32控制SG90舵機的方法步驟

    STM32控制SG90舵機 在這篇博客中,我講解的是SG90的180°型號的舵機。其它型號的
    發(fā)表于 02-21 07:21

    STM32—TIM3輸出PWM信號驅(qū)動MG996R舵機按鍵控制

    MG996R舵機按鍵控制。相關(guān)知識:TIM定時器基本原理,TIM輸出PWM信號、MG996R舵機驅(qū)動原理二、MG996R
    發(fā)表于 11-23 18:21 ?58次下載
    <b class='flag-5'>STM32</b>—TIM3輸出<b class='flag-5'>PWM</b>信號<b class='flag-5'>驅(qū)動</b>MG996R<b class='flag-5'>舵機</b>(<b class='flag-5'>按鍵控制</b>)

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

    規(guī)定的要求進行的速度進行轉(zhuǎn)動。數(shù)字舵機在反應(yīng)速度方面與模擬舵機相比是由優(yōu)勢的。因為數(shù)字舵機是擁有微處理器。下面我們介紹的SG90舵機就是模擬
    發(fā)表于 11-30 14:21 ?27次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>控制</b><b class='flag-5'>SG90</b><b class='flag-5'>舵機</b>教程(180度和360度)

    STM32驅(qū)動SG90舵機

    的,實際上在某寶購買的時候360°、180°、90°的SG90都叫這個名字,如果你真的不懂的話,選購之前最好是問問客服可以旋轉(zhuǎn)多少度。杜邦線若干。2.接線方法主要是SG90舵機的三根線
    發(fā)表于 12-24 19:24 ?47次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>SG90</b><b class='flag-5'>舵機</b>

    STM32控制舵機的方法及實例

    STM32控制SG90舵機 在這篇博客中,我講解的是SG90的180°型號的舵機。其
    發(fā)表于 12-24 19:30 ?127次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>控制</b><b class='flag-5'>舵機</b>的方法及實例

    pwm控制SG90舵機資料分享

    pwm控制SG90舵機資料分享
    發(fā)表于 07-10 09:22 ?33次下載
    亲朋棋牌大厅下载| 大发888娱乐城优惠码| 户型风水不好害死人 24种破财户| 百家乐官网筹码方| 皇冠网文学网址| 大发888方官| 百家乐打闲赢机会多| 博九百家乐游戏| 百家乐官网能破解| 澳门百家乐官网有限公司| 欢乐谷娱乐城官网| 太阳城线上娱乐城| 百家乐看澳门| 百家乐赢钱战略| 91百家乐官网的玩法技巧和规则 | 皇冠百家乐官网代理网| 战神国际娱乐| 什么棋牌游戏能赚钱| 澳门档百家乐的玩法技巧和规则 | 大发888客户端的 软件| 百家乐博弈指| 百家乐五星宏辉怎么玩| 百家乐真钱路怎么看| 伟易博百家乐官网娱乐城| 百家乐官网常用公式| 百家乐官网787| 阿鲁科尔沁旗| 在线棋牌游戏| 娱乐城注册| 大发888游戏平台黄埔| 水果机游戏| 百家乐翻天超清| 百家乐的玩法技巧和规则| 百家乐高手的心得| 娱乐城送体验金| 大发888更名网址6| 威尼斯人娱乐平台| 威尼斯人娱乐城返佣| 中骏百家乐的玩法技巧和规则| 什么是百家乐平注法| 百家乐的分析|