加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

第四章-V1.5舵機(jī) 舵機(jī)角度控制 PWM控制紅外對(duì)管和按鍵控制 STM32驅(qū)動(dòng)舵機(jī)控制

08/22 11:01
945
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

第四章-V1.5舵機(jī) 舵機(jī)角度控制 PWM控制紅外對(duì)管和按鍵控制 STM32驅(qū)動(dòng)舵機(jī)控制 SG90控制 超聲波支架 STM32智能小車 舵機(jī)控制 江科大同款筆記單片機(jī)筆記嵌入式課程STM32嵌入式控制

當(dāng)前視頻版本V1.5.0

現(xiàn)在有兩個(gè)版本小車

V1.5.0-STM32智能小車
視頻鏈接:


[stm32入門教程][STM32實(shí)戰(zhàn)項(xiàng)目]STM32智能小車V1.5-stm32f103c8t6-stm32最小系統(tǒng)-手把手入門教程-嵌入式開發(fā)-嵌入式學(xué)習(xí)

V3.3.0-STM32智能小車
視頻鏈接


STM32智能小車V3-STM32入門教程-openmv與STM32循跡小車-stm32f103c8t6-電賽 嵌入式學(xué)習(xí) PID控制算法 編碼器電機(jī) 跟隨

介紹:
V1.5.0:庫(kù)函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。
V3:HAL庫(kù)開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制。

舵機(jī)控制

查看原理圖

在這里插入圖片描述

芯片手冊(cè)

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

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

初始化函數(shù)為

//TIM3 PWM部分初始化
//PWM輸出初始化
//arr:自動(dòng)重裝值
//psc:時(shí)鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能對(duì)應(yīng)時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定時(shí)器3時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//使能GPIO外設(shè)和AFIO復(fù)用功能模塊時(shí)鐘
//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è)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄
存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中
指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位
//初始化TIM3 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時(shí)器模式: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
}

讓舵機(jī)搖搖頭

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

TIM3_PWM_Init(999,1439); //時(shí)鐘源為72MHZ 故72 000 000 /
(1439+1)/(999+1)=50HZ
TIM_SetCompare1(TIM3,32); //舵機(jī)向右
delay_ms(900);
TIM_SetCompare1(TIM3,80); //舵機(jī)向前
delay_ms(900);
TIM_SetCompare1(TIM3,130); //舵機(jī)向左
delay_ms(900);

然后

按鍵與紅外對(duì)管

按鍵外部中斷實(shí)驗(yàn)

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

查看原理圖

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

配置按鍵端口模式

通過(guò)原理圖知: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時(shí)鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA7設(shè)置成輸入,默認(rèn)下拉
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ù)用功能時(shí)鐘
//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)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子
優(yōu)先級(jí)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)先級(jí)2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子
優(yōu)先級(jí)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上的中斷標(biāo)志位
}
}
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上的中斷標(biāo)志位
}
}

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

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

燒錄調(diào)試

觀察現(xiàn)象

紅外對(duì)管硬件使用方法

詳見:系統(tǒng)硬件設(shè)計(jì)->紅外循跡模塊
可以把紅外對(duì)管看成’按鍵’,當(dāng)前面有黑色時(shí)候?yàn)?a class="article-link" target="_blank" href="/tag/%E9%AB%98%E7%94%B5%E5%B9%B3/">高電平,前面白色低電平。

紅外對(duì)管的驅(qū)動(dòng)

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

紅外管GPIO初始化

注意:這里我們需要使用的PB3、PB4、PA15是單片機(jī)的’特殊引腳
我們打開數(shù)據(jù)手冊(cè):STM32F103x8B_DS_CH_V10,在引腳定義章節(jié),說(shuō)明了復(fù)位后的主功能和默認(rèn)復(fù)用功能以及重定義功能。
在這里插入圖片描述
在參考手冊(cè):STM32中文參考手冊(cè)_V10, 在8.3.5 JTAG/SWD復(fù)用功能重映射中,說(shuō)明了引腳使用
在這里插入圖片描述
所以我們需要關(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時(shí)鐘
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();

紅外對(duì)管控制小燈

while(1){
if(HW_1 == 1 && HW_2==0 && HW_3 == 1 && HW_4 == 0 )//當(dāng)?shù)谝粋€(gè)和第三
個(gè)前面是黑色時(shí)候板子小燈亮,其他情況板子小燈滅
{
LED =0;
}
else{
LED =1;
}
}

練一練–紅外對(duì)管循跡

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
ECS-160-10-30B-CKM-TR 1 ECS International Inc Parallel - Fundamental Quartz Crystal,

ECAD模型

下載ECAD模型
$7.67 查看
ECS-2520S18-384-EN-TR 1 ECS International Inc HCMOS Output Clock Oscillator,

ECAD模型

下載ECAD模型
$1.86 查看
ASFLMPLV-100.000MHZ-LR-T 1 Abracon Corporation MEMS OSC XO 100.0000MHZ LVDS SMD

ECAD模型

下載ECAD模型
$4.88 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜