一、定時器的兩路通道產生兩路pwm
這裡我用的是定時器3的通道1和通道3,主要步驟如下:
1、開啟 tim3 時鐘,配置 pb0和pa0 為復用輸出
要使用 tim3,我們必須先開啟 tim3 的時鐘(通過 apb1enr 設定),這裡我們還要配置 pb0和pa6為復用輸出,這是因為 tim3_ch1 通道將對映到 pb0上,tim3-ch3對映到pa6上此時, pb0和pa6屬於復用功能輸出。
2、設定 tim3 的 arr 和 psc
在開啟了 tim3 的時鐘之後,我們要設定 arr 和 psc 兩個暫存器的值來控制輸出 pwm 的週期。當 pwm 週期太慢(低於 50hz)的時候,我們就會明顯感覺到閃爍了。因此, pwm 週期在這裡不宜設定的太小。
3、設定 tim3_ch1和tim3_ch3 的 pwm 模式
接下來,我們要設定 tim3_ch1 和tim3_ch3為 pwm 模式(預設是凍結的),因為我們的電機是低電平轉的快,而我們希望當 ccr1 和ccr3的值小的時候, 就暗, ccr1和ccr2值大的時候,電機的轉速就快,所以我們要通過配置tim3_ccmr1的相關位來控制tim3_ch1的模式,通過tim_ccmr2的相關位來控制tim3_ch3的模式。
4、使能 tim3 的 ch2 輸出,使能 tim3
在完成以上設定了之後,我們需要開啟tim3 的通道 1和通道3輸出以及 tim3。前者通過tim3_ccer1和tim_ccmr2 來設定,是單個通道的開關,而後者則通過 tim3_cr1 來設定,是整個 tim3 的總開關。只有設定了這兩個暫存器,這樣我們才能在 tim3 的通道1和通道3 上看到 pwm 波輸出。
5、修改 tim3_ccr1和tim_ccr3 來控制占空比。
最後,在經過以上設定之後, pwm 其實已經開始輸出了,只是其占空比和頻率都是固定的,而我們通過修改 tim3_ccr1和tim_ccr3則可以控制 ch1和ch2的輸出占空比。繼而控制 兩個電機的速度。
通過以上 65個步驟,我們就可以控制 tim3 的 ch1ch3輸出 pwm 波了。 這裡特別提醒一下大家,高階定時器雖然和通用定時器類似,但是高階定時器要想輸出 pwm,必須還要設定乙個moe 位(timx_bdtr 的第 15 位),以使能主輸出,否則不會輸出 pwm!!
兩路pwm**片:
1、配置定時器3
在該工程下新建乙個資料夾命名為timer,裡面包括兩個檔案:timer.c和timer.h.
timer.c主要包括以下兩段**定時器3的初始化和pwm的初始化。
(1)定時器3初識化
void tim3_int_init(u16 arr,u16 psc)
(2)tim3 pwm初始化:
void tim3_pwm_init(u16 arr,u16 psc)
timer.h**如下:
#ifndef __timer_h
#define __timer_h
#include "sys.h"
//1,增加tim3_pwm_init函式。
//2,增加left和right巨集定義,控制tim3_ch1脈寬
//通過改變tim3->ccr1和tim->cr3的值來改變占空比,從而控制電機的速度
#define left tim3->ccr1
#define right tim3->ccr3
void tim3_int_init(u16 arr,u16 psc);
void tim3_pwm_init(u16 arr,u16 psc);
#endif
2.電機模組io口初識化:
在該工程下新建乙個資料夾命名為moter,裡面包括兩個檔案:moter.c和moter.h,moter.c**如下
#include "moter.h"
void moter_init(void)
moter.h**如下:
#ifndef __moter_h
#define __moter_h
#include "sys.h"
//電機埠定義(pwma pb0 pwmb pa6)
#define ain2 pbout(1)
#define ain1 pbout(2)
#define stby pbout(3)
#define bin2 pcout(5)
#define bin1 pcout(4)
void moter_init(void); //初始化
#endif
3.test.c
主要包括小車前進、後退、左右的一些函式,然後再通過改變left和right的值來改變tim3->ccr1和tim3->cr3的值來改變電機的速度:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "moter.h"
#include "timer.h"
void hou(void)//定義後退函式
void stop(void)//停
void you(void)//右拐
void zuo(void)//左拐
void go(void)//前進
int main(void)
}
通過以上的程式可以實現電機前進調速。希望對大家有所幫助。 STM32小車篇之電機轉動
首先,我們要明白 電機轉動的實質其實是對pwm波的控制輸出 庫函式直接呼叫封裝好的函式 tim setcompare1 或者用ccr調節占空比 pwm波輸出的原理圖如下 然後,進行 的編寫,可以引用正點原子的例程 在此基礎上進行 的編寫。我小車是直接控制兩個電機,四個電機分成兩組。讓其中一側電機的狀...
STM32伺服電機PWM
這篇文章是關於在stm32 stm32f103c 微控制器中使用pwm 脈衝寬度調製 的詳細教程。脈寬調變 pwm 用於控制數碼訊號的幅度,以控制需要電源的裝置和應用。這是有關pwm生成的高階教程。我們將學習如何使用stm32系列 stm32f103c 微控制器生成可變pwm訊號。可變pwm訊號用於...
STM32 電機PWM控制
2.1.1 實現工具 stm32微控制器 直流減速電機 tb6612雙路電機驅動器 keil5 2.1.2 電機實物接線 具體到我們的電機,我們可以看看電機後面的 中間的四根線 紅綠白黑 是編碼器的線,只是用於測速,和直流電機本身沒有聯絡。綜上所述,我們只需控制施加在黃線和棕色線兩端的直流電壓大小和...