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

基于STM32配置PWM的輸出和相關(guān)GPIO口的配置(有關(guān)重映像問題解答)

這篇具有很好參考價值的文章主要介紹了基于STM32配置PWM的輸出和相關(guān)GPIO口的配置(有關(guān)重映像問題解答)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

使用STM32定時器進(jìn)行PWM的配置有以下幾個步驟,以下是參考例差可以作為歷程參考。

/******************************************************************************************************************************
*使用PWM來實(shí)現(xiàn)對電機(jī)的控制,實(shí)現(xiàn)開環(huán)的速度控制
*
*使用四個直流電機(jī) motor1:     motor2:     
*                motor3:     motor4:
*
cnt = 0 對應(yīng)占空比0

TIM3:(部分重映像)
CH1:PB4
CH2:PB5
CH3:PB0
CH4:PB1

TIM4:
CH1:PB6
CH2:PB7
CH3:PB8
CH4:PB9
*******************************************************************************************************************************/
void TIM_PWM_Init(void)
{
	//設(shè)置變量
	GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure; 
	
	//使能時鐘
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 , ENABLE);
	RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
	GPIO_PinRemapConfig( GPIO_PartialRemap_TIM3 , ENABLE);//使定時器TIM4進(jìn)行部分重映像操作
	//GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE);
	 
	
	TIM_TimeBaseStructure.TIM_Period = 899;
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);
	TIM_TimeBaseInit(TIM4 , &TIM_TimeBaseStructure);
	
	//端口復(fù)用
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 ;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 	
	GPIO_Init(GPIOB, &GPIO_InitStructure);   
	
	
	//PB4:TIM3_CH1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC1Init(TIM3 , &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3 , TIM_OCPreload_Enable);
	
	//PB5:TIM3_CH2
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 450;
	TIM_OC2Init(TIM3 , &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM3 , TIM_OCPreload_Enable);
	
	//PB0:TIM3_CH3
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC3Init(TIM3 , &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM3 , TIM_OCPreload_Enable);
	
	//PB1:TIM3_CH4 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC4Init(TIM3 , &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM3 , TIM_OCPreload_Enable);
	
	
//	
	//PB6:TIM4_CH1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 900;
	TIM_OC1Init(TIM4 , &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM4 , TIM_OCPreload_Enable);
	
	//PB7:TIM4_CH2
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 900;
	TIM_OC2Init(TIM4 , &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM4 , TIM_OCPreload_Enable);
	
	//PB8:TIM4_CH3
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;
	TIM_OC3Init(TIM4 , &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM4 , TIM_OCPreload_Enable);
	
	//PB9:TIM4_CH4
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 900;
	TIM_OC4Init(TIM4 , &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM4 , TIM_OCPreload_Enable);

	TIM_Cmd(TIM3, ENABLE);
	TIM_Cmd(TIM4, ENABLE);
}

在上述PWM初始化函數(shù)中使用定時器TIM3和TIM4來輸出PWM波,其中為了更好的應(yīng)用IO口的布局等等TIM3進(jìn)行了部分重映像的操作,這意味著部分引腳可以使用重映像的操作使之擁有另外的功能,即讓TIM4本來該復(fù)用的引腳重映像到了其他引腳上。這個時候我們就需要查找相關(guān)的參考手冊來對比引腳關(guān)系。如我使用的STM32F103。

stm32pwm配置詳解,stm32,單片機(jī),嵌入式硬件

通過表格我們就可以知道我想要使用PB4和PB5作為PWM的輸出引腳,所以對TIM3使用了部分重映像的功能,實(shí)現(xiàn)這個功能的代碼是:

GPIO_PinRemapConfig( GPIO_PartialRemap_TIM3 , ENABLE);//使定時器TIM3進(jìn)行部分重映像操作

? ?? 這里有一個值得注意的地方,若是其他的功能引腳需要復(fù)用IO口,同樣也是需要相同的方法來對該外設(shè)進(jìn)行部分重映像或完全重映像(若是沒有重映象則不需要),而需要重映像對象則可以在庫函數(shù)中找到。如我需要使用PD8和PD9作為USART3的TXD和RXD引腳則需要完全重映像USART3:

	RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART3, ENABLE );     /* 使能USART1,GPIOA時鐘 */
	GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);    //完全重映像USART3,使用PD8和PD9作為USART3的TXD和RXD引腳

除了重映像的問題其余就是以下幾個步驟:

(1)使能時鐘????????

(2)配置GPIO口? pin、speed、mode等,其中mode需選擇為GPIO_Mode_AF_PP復(fù)用輸出。

(3)配置基本的定時器參數(shù),

typedef struct
{
  uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.
                                       This parameter can be a number between 0x0000 and 0xFFFF */

  uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.
                                       This parameter can be a value of @ref TIM_Counter_Mode */

  uint16_t TIM_Period;            /*!< Specifies the period value to be loaded into the active
                                       Auto-Reload Register at the next update event.
                                       This parameter must be a number between 0x0000 and 0xFFFF.  */ 

  uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.
                                      This parameter can be a value of @ref TIM_Clock_Division_CKD */

  uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounter
                                       reaches zero, an update event is generated and counting restarts
                                       from the RCR value (N).
                                       This means in PWM mode that (N+1) corresponds to:
                                          - the number of PWM periods in edge-aligned mode
                                          - the number of half PWM period in center-aligned mode
                                       This parameter must be a number between 0x00 and 0xFF. 
                                       @note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;

TIM_Prescaler:定時器分頻系數(shù)psc,對時鐘頻率進(jìn)行分頻;

TIM_CounterMode:計(jì)數(shù)模式,向上計(jì)數(shù)或是向下計(jì)數(shù)

TIM_Period:時鐘周期

TIM_ClockDivision:時鐘分頻。(設(shè)置為0即可)

(4)配置定時器的輸出參數(shù):

	//PB4:TIM3_CH1 TIM3通道1
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//PWM1輸出模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_Pulse = 0;//cnt捕獲值,和占空比有關(guān)
	TIM_OC1Init(TIM3 , &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM3 , TIM_OCPreload_Enable);

PWM的占空比為n = pul/arr

PWM的周期計(jì)算為 T = psc/72M(f103的時鐘頻率)*arr 如arr=1000,psc=7200,arr=1000則可計(jì)算PWM周期為T=7200/72000000*1000=0.1s f=1/T=10HZ

(5)使能TIM定時器

    TIM_Cmd(TIM3, ENABLE);
	TIM_Cmd(TIM4, ENABLE);
	TIM_Cmd(TIM2, ENABLE);

這就是初始化PWM的整個流程,希望可以幫助到你。文章來源地址http://www.zghlxwxcb.cn/news/detail-732734.html

到了這里,關(guān)于基于STM32配置PWM的輸出和相關(guān)GPIO口的配置(有關(guān)重映像問題解答)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • STM32F407 GPIO口輸出配置配置步驟

    STM32F407 GPIO口輸出配置配置步驟

    STM32F407ZGT6 是意法半導(dǎo)體(STMicroelectronics)公司推出的一款高性能ARM Cortex-M4核心的32位微控制器(MCU)。它是 STM32F4 系列的一員,具備強(qiáng)大的處理能力和豐富的外設(shè)功能,適用于各種應(yīng)用領(lǐng)域。 說明:STM32F4 的主頻最高是 168Mhz,所以我們一般設(shè)置 PLLCLK 為 168Mhz(M=8,N=336,P=2),通

    2024年02月12日
    瀏覽(27)
  • STM32 HAL庫 通用定時器介紹及相關(guān)應(yīng)用例程 定時器中斷 輸出PWM (點(diǎn)亮LED呼吸燈、輸出PWM、輸入捕獲) CubeMX

    STM32 HAL庫 通用定時器介紹及相關(guān)應(yīng)用例程 定時器中斷 輸出PWM (點(diǎn)亮LED呼吸燈、輸出PWM、輸入捕獲) CubeMX

    (部分圖引自于ATK) 前情提要(基本定時器) 點(diǎn)此進(jìn)入 通用定時器類別 通用定時器和基本定時器相比大致的工作方式是相似的,不過通用定時器比基本定時器多了一些很好用的功能,比如: 外部輸入捕獲 輸出比較 輸出PWM 時鐘源 CubeMX為我們提供了配置時鐘的非常方便的工

    2024年04月15日
    瀏覽(39)
  • STM32高級定時器輸出指定數(shù)量PWM(STM32CubeMx配置)

    STM32高級定時器輸出指定數(shù)量PWM(STM32CubeMx配置)

    高級定時器中有一個重復(fù)計(jì)數(shù)器,本實(shí)驗(yàn)輸出指定個數(shù)PWM就是利用了重復(fù)計(jì)數(shù)器的特性,先來看看重復(fù)計(jì)數(shù)器的特性是什么: 計(jì)數(shù)器每次上溢或下溢都能使重復(fù)計(jì)數(shù)器減1,減到0時,再發(fā)生一次溢出就會產(chǎn)生更新事件 這是什么意思呢,這里舉個例子比如說我設(shè)定重復(fù)計(jì)數(shù)器的

    2024年02月02日
    瀏覽(22)
  • STM32初學(xué)入門筆記(2):STM32CubeMX配置STM32輸出可調(diào)PWM方波

    STM32初學(xué)入門筆記(2):STM32CubeMX配置STM32輸出可調(diào)PWM方波

    PWM是一種應(yīng)用廣泛的利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種技術(shù)(即對脈沖寬度的控制)PWM同時也是驅(qū)動蜂鳴器,驅(qū)動舵機(jī),通信等重要的一環(huán),而對于初學(xué)者而言,點(diǎn)完燈的下一個程序就是驅(qū)動蜂鳴器,本篇將講述如何使用及調(diào)整PWM輸出頻率,占空比 工程文

    2024年02月14日
    瀏覽(19)
  • STM32使用CubeMx配置定時器輸出PWM

    STM32使用CubeMx配置定時器輸出PWM

    ????????項(xiàng)目中經(jīng)常使用到STM32來輸出PWM,每次配置過后過不了多久就會忘記,稍微需要對配置做出修改時都要翻很久的手冊,所以決定結(jié)合實(shí)例把PWM配置的詳細(xì)步驟記錄下來,這樣在下次配置時可以很快的撿起來。 ????????本文檔的行文結(jié)構(gòu)如下,首先,說明實(shí)際需

    2024年02月03日
    瀏覽(27)
  • STM32一個定時器同時配置編碼器和PWM輸出時PWM無法正常輸出的原因【避坑】

    STM32一個定時器同時配置編碼器和PWM輸出時PWM無法正常輸出的原因【避坑】

    ? ? ? ? ?最近我在做寫代碼的時候,因?yàn)槎〞r器的資源緊張,就在一個定時器上同時配置了編碼器和PWM,發(fā)現(xiàn)PWM無法正常輸出,查了很久發(fā)現(xiàn)網(wǎng)上資料不多,在仔細(xì)翻閱手冊研究后才發(fā)現(xiàn)是 時鐘信號 的問題。 具體原因 定時器在設(shè)置編碼器模式后,計(jì)數(shù)的時鐘源就會變成編

    2024年02月04日
    瀏覽(23)
  • 用STM32CubeMX配置輸出PWM信號控制多路舵機(jī)(HAL)

    用STM32CubeMX配置輸出PWM信號控制多路舵機(jī)(HAL)

    (1)編程平臺:Keil5 (2)CubeMX (1)本此使用最小核心板STM32F103C8T6為例 (2)一個舵機(jī):SG90或者M(jìn)G996等均可 (3)ST-link 下載器 (4)杜邦線若干 ????????舵機(jī)的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內(nèi)的角度控制脈沖部分,總間隔為2ms。以180度角度

    2023年04月09日
    瀏覽(26)
  • 嵌入式-Stm32-江科大基于標(biāo)準(zhǔn)庫的GPIO通用輸入輸出口

    嵌入式-Stm32-江科大基于標(biāo)準(zhǔn)庫的GPIO通用輸入輸出口

    (推薦先看文章:《 嵌入式-32單片機(jī)-GPIO推挽輸出和開漏輸出》) 下文圖都是從參考手冊借閱:STM32F10xxx(中文),大概頁數(shù)是110/775左右 GPIO (General Purpose Input Output)通用輸入輸出口 可配置為8種輸入輸出模式 引腳電平:0V~3.3V,部分引腳可容忍5V(有FT標(biāo)識) 輸出模式 下可控

    2024年01月17日
    瀏覽(92)
  • STM32 PWM模式與輸出比較模式的區(qū)別。PWM占空比不生效,在STM32CubeMX中配置PWM的兩種模式——藍(lán)橋杯嵌入式

    STM32 PWM模式與輸出比較模式的區(qū)別。PWM占空比不生效,在STM32CubeMX中配置PWM的兩種模式——藍(lán)橋杯嵌入式

    ? ??【藍(lán)橋杯嵌入式】專題正在持續(xù)更新中,原理圖解析?,各模塊分析?以及歷年真題講解?都已更新完畢,歡迎大家前往訂閱本專題?? ??【藍(lán)橋杯嵌入式】藍(lán)橋杯第十屆省賽真題 ??【藍(lán)橋杯嵌入式】藍(lán)橋杯第十二屆省賽程序真題 ??【藍(lán)橋杯嵌入式】藍(lán)橋杯第十三屆

    2023年04月15日
    瀏覽(31)
  • 步進(jìn)電機(jī)簡單使用:STM32 PWM輸出固定數(shù)目的脈沖數(shù)(基于CubeMX)

    步進(jìn)電機(jī)簡單使用:STM32 PWM輸出固定數(shù)目的脈沖數(shù)(基于CubeMX)

    使用步進(jìn)電機(jī)之前,我們需要了解步距角的概念:步進(jìn)電機(jī)接收到一個脈沖轉(zhuǎn)動的角度,步進(jìn)電機(jī)步距角通常 為1.8°,即步進(jìn)電機(jī)接收到一個脈沖轉(zhuǎn)動1.8°,則若步進(jìn)電機(jī)接收到360°/1.8°=200個脈沖,步進(jìn)電機(jī)就能轉(zhuǎn)動一圈 步進(jìn)電機(jī)通過驅(qū)動器控制,驅(qū)動器如下圖所示(都比較

    2024年02月06日
    瀏覽(53)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包