国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

stm32——pwm驅(qū)動LED燈、舵機(jī)、直流電機(jī)

這篇具有很好參考價值的文章主要介紹了stm32——pwm驅(qū)動LED燈、舵機(jī)、直流電機(jī)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、知識點補(bǔ)充

1.PWM波輸出與GPIO的引腳對應(yīng)關(guān)系圖

stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件
stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件

a. TIM2的引腳復(fù)用子啊PA0引腳上,所以TIM2、CH1、PA0三者是捆綁在一起的,即在PA0引腳上通過TIM2通道1CH1輸出PWM
b. TIM2、CH1、PA0三者一般是捆綁在一起,但可以通過重映射改變
c. TIM2、CH2、PA1同理

2.重映射簡介

stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件
改為PA15,選擇重映射方式1或完全重映射
在時鐘開啟后寫入

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //PA15為調(diào)試端口,需要解除調(diào)試端
若想要讓PA15、PB3、PB4這三個引腳當(dāng)作普通GPIO來使用,則加第一、三句,打開AFIO時鐘,讓AFIO時鐘將JTAG復(fù)用解除掉
如果想要重映射定時器或者其他外設(shè)的復(fù)用引腳,加第一句和第二句,就要先打開AFIO時鐘,再用AFIO重映射外設(shè)復(fù)用的引腳,
若重映射的引腳正好是調(diào)試端口,則三句全加上

3.計數(shù)器的計算

PWM頻率=計數(shù)器更新頻率
比如要產(chǎn)生一個頻率為1KHz,占空比為50%,分辨率為1%的PWM波形
72M/(PSC+1)/ (ARR+1)=1000
CCR/(ARR+1)=0.5
1/(ARR+1)=0.01
計算得:ARR=99,CCR=50, PSC=720-1;

4.基本步驟

stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件

第一步:RCC開啟時鐘,打開TIM外設(shè)和GPIO外設(shè)的時鐘
第二步:配置時基單元,包括時基單元和時基單元前的時鐘源選擇(不選擇則默認(rèn)內(nèi)部時鐘)
第三步:配置輸出比較單元,里面包括CCR的值、輸出比較模式、極性選擇、輸出使能(結(jié)構(gòu)體配置)
第四步:配置GPIO口,初始化為復(fù)用推挽輸出的配置
第五步:運行控制,啟動計數(shù)器,就能輸出PWM波

5.輸出比較模式簡介

stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件
常用模式為 PWM1模式1

二、實例

1.PWM驅(qū)動LED燈

PWM.c

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)	
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //第一步,開啟時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;  //第四步,配置GPIO
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;   //第二步,配置時基單元
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

	
	TIM_OCInitTypeDef TIM_OCInitStructure;   //第三步,配置輸出比較單元(CCR)
	TIM_OCStructInit(&TIM_OCInitStructure);  //初始化所以結(jié)構(gòu)體(結(jié)構(gòu)體中有帶N的變量,是高級配置輸出比較單元才有的,本次實例不需要用到,初始化后讓他不影響別的模塊)
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //設(shè)置比較輸出模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //設(shè)置極性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //設(shè)置輸出使能
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR(0-0xff)
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);  
	
	TIM_Cmd(TIM2,ENABLE);//第五步,運行控制啟動
	
}


void PWM_SetCompare1(uint16_t Compare) //由main.c設(shè)置占空比
{
	TIM_SetCompare1(TIM2,Compare); 
}

PWM.h

#ifndef  __PWM_H__
#define  __PWM_H__

void PWM_SetCompare1(uint16_t Compare);
void PWM_Init(void);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	while(1)
	{
		for(i=0;i<=100;i++)  更改CCR值
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		for(i=0;i<=100;i++)
		{
			PWM_SetCompare1(100-i);
			Delay_ms(10);
		}	
	}
}

2.PWM驅(qū)動舵機(jī)

參數(shù)計算
stm32驅(qū)動舵機(jī)pwm,stm32,單片機(jī),嵌入式硬件

舵機(jī)要求頻率 :50Hz(周期為20ms)
舵機(jī)角度控制(占空比):0.5-2.5ms(時長)
(3個變量,2個方程)解不是唯一的
為方便計算
取PSC+1=72,ARR+1=20k
當(dāng)CCR=500時,高電平時長為0.5ms 

PWM.c

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)	
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
			TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;		//ARR
			TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;	//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
	
}


		void PWM_SetCompare2(uint16_t Compare)  //變?yōu)橥ǖ?
{
	TIM_SetCompare2(TIM2,Compare);
}

Servo.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
 
void Servo_Init(void)
{
	PWM_Init();
}
 
void Servo_SetAngle(float Angle)  //參數(shù)為浮點型,方便寫入
{
	PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"
 
uint8_t KeyNum;
float Angle;
 
int main(void)
{
	OLED_Init();
	Servo_Init();
	Init_KEY();
	
	OLED_ShowString(1, 1, "Angle:");
	
	while (1)
	{
		KeyNum = Key_Getnum();
		if (KeyNum == 1)
		{
			Angle += 30;
			if (Angle > 180)
			{
				Angle = 0;
			}
		}
		Servo_SetAngle(Angle);
		OLED_ShowNum(1, 7, Angle, 3);
	}
}

3.PWM驅(qū)動直流電機(jī)

pwm.c

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)	
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
			TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
			TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
			TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
	
}


		void PWM_SetCompare3(uint16_t Compare)
{
	TIM_SetCompare3(TIM2,Compare);
}

Motor.c

#include "stm32f10x.h"                  // Device header
#include "PWM.h"
 
void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	PWM_Init();
}
 
void Motor_SetSpeed(int8_t Speed)
{
	if (Speed >= 0)//正轉(zhuǎn)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_4);
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
		PWM_SetCompare3(Speed);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_4);//反轉(zhuǎn)
		GPIO_SetBits(GPIOA, GPIO_Pin_5);
		PWM_SetCompare3(-Speed);
	}
}

main.c文章來源地址http://www.zghlxwxcb.cn/news/detail-765471.html

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
 
uint8_t KeyNum;
int8_t Speed;
 
int main(void)
{
	OLED_Init();
	Motor_Init();
	Init_KEY();
	
	OLED_ShowString(1, 1, "Speed:");
	
	while (1)
	{
		KeyNum = Key_Getnum();
		if (KeyNum == 1)
		{
			Speed += 20;
			if (Speed > 100)
			{
				Speed = -100;
			}
		}
		Motor_SetSpeed(Speed);
		OLED_ShowSignedNum(1, 7, Speed, 3);
	}
}

到了這里,關(guān)于stm32——pwm驅(qū)動LED燈、舵機(jī)、直流電機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【51單片機(jī)】直流電機(jī)驅(qū)動(PWM)(江科大)

    【51單片機(jī)】直流電機(jī)驅(qū)動(PWM)(江科大)

    · 直流電機(jī)是一種將電能轉(zhuǎn)換為機(jī)械能的裝置。一般的直流電機(jī)有兩個電極,當(dāng)電極正接時,電機(jī)正轉(zhuǎn),當(dāng)電極反接時,電機(jī)反轉(zhuǎn) · 直流電機(jī)主要由永磁體(定子)、線圈(轉(zhuǎn)子)和換向器組成 · 除直流電機(jī)外,常見的電機(jī)還有步進(jìn)電機(jī)、舵機(jī)、無刷電機(jī)、空心杯電機(jī)等 電機(jī)的驅(qū)動無法

    2024年02月20日
    瀏覽(20)
  • 【51單片機(jī)】直流電機(jī)的驅(qū)動和PWM調(diào)速

    【51單片機(jī)】直流電機(jī)的驅(qū)動和PWM調(diào)速

    51單片機(jī)驅(qū)動直流電機(jī)與 PWM 調(diào)速是通過使用 51 單片機(jī)來控制直流電機(jī)的轉(zhuǎn)速和方向。51 單片機(jī)通過控制電機(jī)的電流來實現(xiàn)驅(qū)動,并通過生成 PWM 信號來調(diào)節(jié)電機(jī)的轉(zhuǎn)速。使用 PWM 調(diào)速可以使得直流電機(jī)的轉(zhuǎn)速精確可控,并且減少了電機(jī)的功率損耗。在 51 單片機(jī)的控制系統(tǒng)中,

    2023年04月09日
    瀏覽(26)
  • 10、江科大stm32視頻學(xué)習(xí)筆記——PWM驅(qū)動led呼吸燈、驅(qū)動舵機(jī)、驅(qū)動直流機(jī)

    10、江科大stm32視頻學(xué)習(xí)筆記——PWM驅(qū)動led呼吸燈、驅(qū)動舵機(jī)、驅(qū)動直流機(jī)

    目錄 一、PWM驅(qū)動LED呼吸燈(燈接在PA0) 1、PWM波和GPIO的對應(yīng)關(guān)系參考引腳定義表 2、計數(shù)器的計算 3、TIM輸出PWM波使用步驟?編輯 4、代碼 (1)輸出化比較單元 (2) PWM.c (3)main.c 5、重映射更換成PA15亮燈 二、PWM驅(qū)動舵機(jī)(舵機(jī)接在PA1、按鍵在PB1)? 1、電路圖 2、參數(shù)計算

    2024年02月14日
    瀏覽(24)
  • STM32PWM控制直流電機(jī)

    STM32PWM控制直流電機(jī)

    PWM介紹 脈沖寬度調(diào)制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調(diào)制,是利用 微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡單一點,就是對脈沖寬 度的控制 PWM的原理: 假定定時器工作在向上計數(shù) PWM 模式,且當(dāng) CNT=CCRx 時輸出 1。那么就可以

    2024年02月08日
    瀏覽(17)
  • STM32第八課:PWM控制直流電機(jī)

    STM32第八課:PWM控制直流電機(jī)

    ????????TB6612FNG是一款新型驅(qū)動器件,能獨立雙向控制2個直流電機(jī),它具有很高的集成度,同時能提供足夠的輸出能力,運行性能和能耗方面也具有優(yōu)勢因此在集成化、小型化的電機(jī)控制系統(tǒng)中,它可以作為理想的電機(jī)驅(qū)動器件。 ??????????????????????????

    2024年03月24日
    瀏覽(21)
  • K_A08_009 基于 STM32等單片機(jī)驅(qū)動TB6612模塊按鍵控制直流電機(jī)正反轉(zhuǎn)加減速啟停

    K_A08_009 基于 STM32等單片機(jī)驅(qū)動TB6612模塊按鍵控制直流電機(jī)正反轉(zhuǎn)加減速啟停

    目錄 一、資源說明 二、基本參數(shù) ? ? ? ? 1、參數(shù) ? ? ? ? 2、引腳說明 三、驅(qū)動說明 ????????TB6612模塊驅(qū)動說明 ????????對應(yīng)程序: ????????ENA ENB輸出PWM 四、部分代碼說明 ????????接線說明 ? ? ? ? ? ? ? ? 1、STC89C52RC+TB6612模塊 ? ? ? ? ? ? ? ? 2、STM32F

    2024年02月15日
    瀏覽(26)
  • STM32-微項目03-pwm控制直流電機(jī)運行

    STM32-微項目03-pwm控制直流電機(jī)運行

    一,項目目標(biāo) 實現(xiàn)利用STM32F103C8T6+TB6612,輸出不同占空比輸出的PWM波,從而實現(xiàn)電機(jī)不同轉(zhuǎn)速的運行、正反轉(zhuǎn)的功能; ? ?二、硬件涉及 1,STM32核心板 2,TB6612直流電機(jī)驅(qū)動模塊 3,直流電機(jī)? 三、硬件接線涉及 1,先看TB6612直流電機(jī)驅(qū)動模塊: ①驅(qū)動模塊是具備兩路PWM輸入

    2024年02月04日
    瀏覽(20)
  • K_A08_005 基于 STM32等單片機(jī)驅(qū)動XY-160D模塊按鍵控制直流電機(jī)正反轉(zhuǎn)加減速啟停

    K_A08_005 基于 STM32等單片機(jī)驅(qū)動XY-160D模塊按鍵控制直流電機(jī)正反轉(zhuǎn)加減速啟停

    目錄 一、資源說明 二、基本參數(shù) 四、部分代碼說明 ????????接線說明 ? ? ? ? ? ? ? ? 1、STC89C52RC+XY-160D模塊 ?????????????????2、STM32F103C8T6+XY-160D模塊 五、基礎(chǔ)知識學(xué)習(xí)與相關(guān)資料下載 六、視頻效果展示與程序資料獲取 七、項目所有材料清單 八、注意事項 九

    2024年02月14日
    瀏覽(36)
  • 一文搞懂如何使用STM32驅(qū)動直流電機(jī)(普通PWM輸出和L298N、高級定時器輸出帶死區(qū)雙通道互補(bǔ)PWM和IR2110S及自舉電路、H橋電路和電機(jī)正反轉(zhuǎn))

    一文搞懂如何使用STM32驅(qū)動直流電機(jī)(普通PWM輸出和L298N、高級定時器輸出帶死區(qū)雙通道互補(bǔ)PWM和IR2110S及自舉電路、H橋電路和電機(jī)正反轉(zhuǎn))

    筆者從開始接觸嵌入式單片機(jī)開始,就和驅(qū)動電機(jī)相伴而走。從最開始的直接買L298N驅(qū)動模塊直接驅(qū)動直流電機(jī),到現(xiàn)在自己設(shè)計PCB電路板驅(qū)動直流電機(jī),可以說是和電機(jī)驅(qū)動共同成長了。現(xiàn)在筆者將這一過程的收獲記錄下來,希望對大家有所幫助。 不用詳細(xì)了解L298N芯片和

    2024年02月02日
    瀏覽(22)
  • stm32+TB6612驅(qū)動直流電機(jī)

    stm32+TB6612驅(qū)動直流電機(jī)

    ????????因為單片機(jī)的不可以直接的驅(qū)動電機(jī),所以需要在他們之間加上一個電機(jī)的驅(qū)動模塊,之前的文章里面用過L298N電機(jī)驅(qū)動模塊,現(xiàn)在再給大家推薦一個新的電機(jī)驅(qū)動模塊,他比L298N好用許多,而且占用體積小,發(fā)熱也少。TB6612可以一次驅(qū)動兩個直流電機(jī),輸出PWM也

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包