STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值
參考:stm32 定時(shí)器輸出PWM原理及工作原理+控制舵機(jī)
作者:點(diǎn)燈小哥
發(fā)布時(shí)間: 2021-03-09 23:17:52
網(wǎng)址:https://blog.csdn.net/weixin_46016743/article/details/114606662
參考:stm32之pwm輸出
作者:打醬油的;
發(fā)布時(shí)間: 2021-04-11 14:59:05
網(wǎng)址:https://blog.csdn.net/weixin_46098612/article/details/115597823
目錄
- 前言
- PWM的工作原理
- PWM的內(nèi)部運(yùn)作機(jī)制
- PWM模式一:邊沿對(duì)齊模式
- PWM模式二:中央對(duì)齊模式
- 自動(dòng)加載的預(yù)加載寄存器
- 通用定時(shí)器輸出PWM結(jié)構(gòu)體
- 通用定時(shí)器輸出PWM庫函數(shù)
- 通用定時(shí)器輸出PWM控制舵機(jī)
- 硬件接線
- 配置步驟:需要配置3個(gè)結(jié)構(gòu)體
- 編程實(shí)現(xiàn)
前言
脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡(jiǎn)稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測(cè)量、通信到功率控制與變換的許多領(lǐng)域中。
PWM的工作原理
TIM3通道2,即PB5,作為本實(shí)驗(yàn)連接舵機(jī)的引腳。
為何不是通道3PWM輸出?不太理解。
上圖最后一句話,點(diǎn)明PWM的原理。
PWM的內(nèi)部運(yùn)作機(jī)制
上圖PWM模式選擇介紹如下:
PWM模式一:邊沿對(duì)齊模式
有效電平由上面的P位決定
PWM模式二:中央對(duì)齊模式
自動(dòng)加載的預(yù)加載寄存器
通用定時(shí)器輸出PWM結(jié)構(gòu)體
注意:結(jié)構(gòu)體只要配置上面4個(gè)紅色字體即可
通用定時(shí)器輸出PWM庫函數(shù)
通用定時(shí)器輸出PWM控制舵機(jī)
硬件接線
SG90電機(jī)
紅線 : 3.3v/ 5v 接到VCC
黑線 : GND
黃線 : 信號(hào)線(PWM輸出端口) 接到PB5
配置步驟:需要配置3個(gè)結(jié)構(gòu)體
編程實(shí)現(xiàn)
motor.h
#include "stm32f10x.h" //固件庫void motor_config(void);motor.c
#include "stm32f10x.h" //固件庫 #include "motor.h"void motor_config(void) {GPIO_InitTypeDef GPIO_MotorInit; //1.GPIO結(jié)構(gòu)體TIM_TimeBaseInitTypeDef TIM_MotorInit; //2.通用定時(shí)器結(jié)構(gòu)體TIM_OCInitTypeDef TIMPWN_MotorInit; //3.配置定時(shí)去輸出PWM結(jié)構(gòu)體RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); //4.1 打開GPIO時(shí)鐘 RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE); //4.2 打開定時(shí)器3時(shí)鐘RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE); //復(fù)用使能時(shí)鐘(我們用到部分重映射)GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE ); //4.3 部分重映射時(shí)鐘 TIM3 上面圖有講GPIO_MotorInit.GPIO_Mode = GPIO_Mode_AF_PP;//復(fù)用推挽輸出(PB5部分重映射 參照上面圖) GPIO_MotorInit.GPIO_Pin = GPIO_Pin_5;//PB5引腳 連接到舵機(jī)的信號(hào)線GPIO_MotorInit.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init( GPIOB, &GPIO_MotorInit );TIM_MotorInit.TIM_ClockDivision = TIM_CKD_DIV1;//設(shè)置時(shí)鐘分頻為1 不分頻TIM_MotorInit.TIM_CounterMode = TIM_CounterMode_Up;//計(jì)數(shù)模式 TIM向上計(jì)數(shù)模式TIM_MotorInit.TIM_Period = 200 - 1 ; //重裝載值 設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載值 200/10000sTIM_MotorInit.TIM_Prescaler = 7200 - 1 ; //預(yù)分頻 TIMx時(shí)鐘頻率預(yù)分頻值 TIM_TimeBaseInit( TIM3, &TIM_MotorInit);//定時(shí)器3TIMPWN_MotorInit.TIM_OCIdleState = TIM_OCMode_PWM1; //選擇PWM模式1 即當(dāng)前CNT值比CCR比較值小為有效電平TIMPWN_MotorInit.TIM_OutputState = TIM_OutputState_Enable; //配置輸出使能TIMPWN_MotorInit.TIM_OCPolarity = TIM_OCPolarity_Low; //比較輸出極性 選低電平 即低電平為有效電平 好像是前面講的P位//還有一個(gè)結(jié)構(gòu)體成員 配置比較值CCRX 后面用固件庫函數(shù)實(shí)現(xiàn)TIM_OC2Init( TIM3, &TIMPWN_MotorInit ); //定時(shí)器3的通道2 所以用OC2TIM_OC2PreloadConfig( TIM3, TIM_OCPreload_Enable); //自動(dòng)加載的預(yù)加載寄存器 使能 前面講到TIM_Cmd( TIM3, ENABLE); }main.c
#include "stm32f10x.h" // Device header #include "usart.h" #include "led.h" #include "tim.h" #include "motor.h"//記得添加路徑void delay(uint16_t time) {uint16_t i = 0;while(time--){i=12000;while(i--);} }int main(void) {uint16_t pwmval = 155; //比較值155 自動(dòng)重裝載值為200 大約3/4motor_config();while(1){ //舵機(jī)在155和195之間 一直循環(huán) for(pwmval = 195;pwmval >= 175;pwmval-=5){ //5. 設(shè)置PWM比較值函數(shù) 即占空比TIM_SetCompare2( TIM3, pwmval); //定時(shí)器3 通道2delay(500);//延時(shí)0.5s } } }總結(jié)
以上是生活随笔為你收集整理的STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U盘安装系统 从此告别光盘
- 下一篇: 使用Office Word 2010/2