日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導(dǎo)讀]關(guān)注「Linux大陸」,星標(biāo)公眾號,一起進(jìn)步!最近在逛21ic論壇,看到幾個帖子都在咨詢?nèi)绾慰刂茊纹瑱C(jī)輸出固定的數(shù)量的PWM脈沖,用于控制電機(jī)的轉(zhuǎn)停,剛好前兩天本人也需要該功能做測試,我是輸出PWM給伺服電機(jī)驅(qū)動器,驅(qū)動器以位置模式工作,收到脈沖就控制電機(jī)轉(zhuǎn)動,如果需要精確控制電...

關(guān)注「Linux大陸」,星標(biāo)公眾號,一起進(jìn)步!


最近在逛21ic論壇,看到幾個帖子都在咨詢?nèi)绾?a href="/tags/控制" target="_blank">控制單片機(jī)輸出固定的數(shù)量的PWM脈沖,用于控制電機(jī)的轉(zhuǎn)停,剛好前兩天本人也需要該功能做測試,我是輸出PWM給伺服電機(jī)驅(qū)動器,驅(qū)動器以位置模式工作,收到脈沖就控制電機(jī)轉(zhuǎn)動,如果需要精確控制電機(jī)轉(zhuǎn)過的角度,就需要給驅(qū)動器輸入固定數(shù)量的脈沖。于是我便用STM32F031的雙定時器實現(xiàn)了該功能,下文便詳細(xì)描述。


我在進(jìn)行代碼編譯之前也在網(wǎng)絡(luò)上搜索過相應(yīng)的方法,總結(jié)起來一共五個方法:


1、單脈沖法,需要一個脈沖中斷一次,中斷次數(shù)多,影響效率

2、一個定時器輸出PWM,另一定時器使用輸入捕獲進(jìn)行中斷計數(shù),與方法1一樣,同樣需要頻繁的中斷

3、用主從定時器門控方式,比較繁瑣

4、用一個定時器(從)作為另一個定時器(主)的外部時鐘觸發(fā)源

5、高級定時器T1、T8的重復(fù)計數(shù)方式,RCR計數(shù)中斷,看手冊好像這種方式最簡單,能滿足一部分人要求,缺點(diǎn)是寄存器只有8位,最多實現(xiàn)255個脈沖計數(shù)輸出。


我在最初時使用了第2和方法,該方法對于我來說你叫簡單,后來在寫這篇文章時選擇了第4個方法,總結(jié)起來還是4比較靠譜,但是這里的第2方法也描述一下,便于大家選擇。


方法2:


因為條件限制,干脆說為了省事,我在原來用于其他功能的板子上進(jìn)行測試,因為只開放了PB3和PB4,所以這里只好用TIM2和TIM3進(jìn)行測試。


TIM2用于產(chǎn)生PWM脈沖輸出,在輸出給驅(qū)動器的同時將該脈沖也接到PB4,也就是TIM3的輸入口,這樣TIM3也能接收到TIM2發(fā)出的脈沖,TIM3只需要配置為輸入捕獲,并開啟中斷,便可以在每次脈沖到來進(jìn)入中斷,在TIM3的中斷中去計數(shù),達(dá)到需要的脈沖數(shù)便關(guān)閉TIM2便可。


首先依舊是初始化端口:


先貼一下time.h文件:


/* 定義防止遞歸包含 ----------------------------------------------------------*/#ifndef _TIMER_H#define _TIMER_H
/* 包含的頭文件 --------------------------------------------------------------*/#include "stm32f0xx.h"

/* 宏定義 --------------------------------------------------------------------*/#define TIM6_COUNTER_CLOCK 1000000 //計數(shù)時鐘(1M次/秒) //預(yù)分頻值#define TIM6_PRESCALER_VALUE (SystemCoreClock/TIM6_COUNTER_CLOCK - 1)#define TIM6_PERIOD_TIMING (10 - 1) //定時周期(相對于計數(shù)時鐘:1周期 = 1計數(shù)時鐘)
#define TIM2_COUNTER_CLOCK 24000000 //計數(shù)時鐘(24M次/秒) //預(yù)分頻值#define TIM2_PRESCALER_VALUE (SystemCoreClock/TIM2_COUNTER_CLOCK - 1)
/* 函數(shù)申明 ------------------------------------------------------------------*/void Systick_Init(void);void Delay_ms(__IO uint32_t nTime);void TimingDelay_Decrement(void);void Delay(uint32_t temp);void delay_us(uint32_t nus);void delay_init();
void TIMER_Initializes(void);
void TIMDelay_N10us(uint16_t Times);void TIMDelay_Nms(uint16_t Times);void TIMDelay_Ns(uint16_t Times);
void TIMER_PWM_GPIO_Configuration(void);void TIM2_CH2_PWM(uint32_t Freq, uint16_t Dutycycle);void TIMER_IC_Configuration(void);
#endif /* _TIMER_H */

因為我的時鐘初始化是單獨(dú)定義的,所以這里未進(jìn)行時鐘的初始化,在參考的我的代碼時需注意:


void TIMER_PWM_GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TIM2引腳 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復(fù)用模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //高速輸出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完輸出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB,
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉