在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)輸出PWM的常見方法

jf_78858299 ? 來源:嵌入式專欄 ? 作者:strongerHuang ? 2023-05-10 14:53 ? 次閱讀

PWM的應(yīng)用可以說非常廣泛,控制電機(jī)速度、燈光亮度、通信調(diào)制等眾多領(lǐng)域。

PWM的問題小伙伴問的比較多,最近也在用PWM,這里就分享一下關(guān)于PWM的一些內(nèi)容。

什么是PWM?

PWM: Pulse Width Modulation,脈沖寬度調(diào)制。

網(wǎng)上的解釋很多,通過下圖,你就能直觀的理解PWM,其實(shí)就是高低電平組成的脈沖信號

圖片

通過改變其中頻率(脈沖周期)、占空比,就能應(yīng)用在很多場合。

圖片

PWM常見輸出方式

通過上面描述,PWM就是一個(gè)IO口以不同的時(shí)間周期輸出高、低電平。

1.新手 (菜鳥) 級別

while循環(huán)中,阻塞延時(shí),控制IO口高低輸出:

while(1)
{
  IO口高電平
  Delay阻塞延時(shí)
  IO口低電平
  Delay阻塞延時(shí)
}

阻塞延時(shí)可以是:軟件模擬延時(shí),定時(shí)器阻塞延時(shí)等。

2.入門 (初級) 級別

while循環(huán)中,非阻賽延時(shí),控制IO口高低輸出:

while(1)
{
  IO口高電平
  Delay非阻塞延時(shí)
  IO口低電平
  Delay非阻塞延時(shí)
}

非阻賽延時(shí)可以是:定時(shí)器標(biāo)識(shí)檢測RTOS(系統(tǒng))延時(shí)等。

3.熟悉 (中級) 級別

定時(shí)器中斷控制IO高低電平輸出:

定時(shí)器中斷配置 ——> 啟動(dòng)定時(shí)器 ——> 響應(yīng)中斷,控制IO高低電平···

4.熟練 (中級+) 級別

定時(shí)器PWM硬件控制輸出:

配置PWM對應(yīng)的IO,以及定時(shí)器PWM輸出 ——> 啟動(dòng)PWM自動(dòng)輸出···

void AppTask(void *p_arg)
{
  PWM_TIM_Configuration();


  PWM_Output(頻率, 占空比);


  while(1)
  {
    //自己的應(yīng)用代碼
  }
}

比較:

上面幾種PWM輸出方式,前面三種都會(huì)CPU干預(yù)PWM的輸出,也就是會(huì)占用CPU資源,特別是前面兩種方式,不僅占用CPU,誤差還比較大。

使用第三種中斷方式,如果頻率比較高,CPU消耗的也比較嚴(yán)重。這種情況適合于沒有硬件PWM輸出的單片機(jī)

第四種就是單片機(jī)自帶硬件PWM輸出功能,只需要簡單配置就可以自動(dòng)輸出PWM波形,無需CPU干預(yù)。

硬件輸出PWM例子

這里以大家熟悉的STM32F1為例:為大家簡單分享一下硬件定時(shí)器輸出PWM波形。

PWM定時(shí)器相關(guān)宏定義:

//定時(shí)器計(jì)數(shù)時(shí)鐘(1M次/秒)
#define PWM_COUNTER_CLOCK         1000000


//預(yù)分頻值(與系統(tǒng)時(shí)鐘、計(jì)數(shù)值有關(guān))
#define PWM_PRESCALER_VALUE       (SystemCoreClock/PWM_COUNTER_CLOCK - 1)

**PWM配置:

**

/**
  * @brief  定時(shí)器PWM輸出配置
  * @param  無
  * @retval 無
  */
void PWM_TIM_Configuration(void)
{
  GPIO_InitTypeDef        GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef       TIM_OCInitStructure;


  /* 時(shí)鐘配置 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);


  /* 引腳配置 */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* 時(shí)基配置 */
  TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER_VALUE;         //預(yù)分頻值
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上計(jì)數(shù)
  TIM_TimeBaseStructure.TIM_Period = 0xFFFF;                         //定時(shí)周期(暫定值)
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;            //分頻因子
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


  /* PWM模式配置 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                  //輸出PWM1模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //使能輸出
  TIM_OCInitStructure.TIM_Pulse = 0;                                 //脈寬值(暫定值)
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;          //輸出極性(TIM_OC1對應(yīng)通道1)
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
}

PWM輸出函數(shù)接口:

/**
  * @brief  輸出PWM
  * @param  Frequency:頻率
            Dutycycle:占空比
  * @retval 無
  */
void PWM_Output(uint32_t Frequency, uint32_t Dutycycle)
{
  uint32_t tim_period;
  uint32_t tim_pulse;


  tim_period = PWM_COUNTER_CLOCK/Frequency - 1;                      //計(jì)算出計(jì)數(shù)周期(決定輸出的頻率)
  tim_pulse  = (tim_period + 1)*Dutycycle / 100;                     //計(jì)算出脈寬值(決定PWM占空比)


  TIM_Cmd(TIM2, DISABLE);                                            //失能TIM
  TIM_SetCounter(TIM2, 0);                                           //計(jì)數(shù)清零
  TIM_SetAutoreload(TIM2, tim_period);                               //更改頻率
  TIM_SetCompare1(TIM2, tim_pulse);                                  //更改占空比(TIM_SetCompare1對應(yīng)通道1)
  TIM_Cmd(TIM2, ENABLE);                                             //使能TIM
}

初始化配置,調(diào)用函數(shù)接口,直接就輸出PWM波形了:

void AppTask(void *p_arg)
{
  PWM_TIM_Configuration();


  PWM_Output(1000, 20);


  while(1)
  {
    //自己的應(yīng)用代碼
  }
}

輸出PWM波形:

圖片

說明:

本例使用的是STM32標(biāo)準(zhǔn)外設(shè)庫,如果要深入理解其中原理,還是建議使用標(biāo)準(zhǔn)外設(shè)庫。

當(dāng)然,如果想要快速使用PWM這個(gè)功能,不想理解其原理,可以直接使用STM32CubeMX配置生成代碼:

圖片

配置注意事項(xiàng)

想要更加精確控制,并更加滿足應(yīng)用層的需求,就需要自己一步一步深入了解原理。

下面說幾點(diǎn)常見的問題吧。

1.引腳映射

如果你使用的引腳需要映射,就需要配置對應(yīng)的參數(shù)

比如:STM32F1使用PB11(需要查看數(shù)據(jù)手冊):

圖片

需要增加對應(yīng)的“映射”代碼:

//復(fù)用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


//定時(shí)器(PWM)引腳映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

2.頻率和占空比精度

如果使用32位定時(shí)器的話,頻率范圍更寬、精度也可以達(dá)到更高。比如:頻率:0.01Hz、 占空比0.01%等。

如果是16位的話,其中的參數(shù)都不能超過16位(65535):

#define PWM_COUNTER_CLOCK         1000000
#define PWM_PRESCALER_VALUE       (SystemCoreClock/PWM_COUNTER_CLOCK - 1)


tim_period = PWM_COUNTER_CLOCK/Frequency - 1;                      //計(jì)算出計(jì)數(shù)周期(決定輸出的頻率)
tim_pulse  = (tim_period + 1)*Dutycycle / 100;                     //計(jì)算出脈寬值(決定PWM占空比)

具體可根據(jù)自己情況進(jìn)行配置,比如PWM(定時(shí)器)計(jì)數(shù)時(shí)鐘、分頻值等。

實(shí)際應(yīng)用代碼,建議增加各個(gè)參數(shù)的判斷,以防越界(這里為了方便理解,就寫的比較簡單)。

3.更多

STM32都有硬件PWM輸出功能,但不同的系列,其配置可能略有一些差異,簡單參考官方例程以及手冊。

現(xiàn)在大部分單片機(jī)都自帶有硬件PWM輸出功能,硬件的好處就是不用CPU干預(yù)。如果沒有,可以嘗試上面說的定時(shí)器中斷的方式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • IO
    IO
    +關(guān)注

    關(guān)注

    0

    文章

    454

    瀏覽量

    39242
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5196

    瀏覽量

    214405
  • 通信調(diào)制器
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    5275
  • 電機(jī)速度控制
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    1421
收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)Flash自檢和添加CRC常見方法

    市面上很多基于單片機(jī)的產(chǎn)品都具有在線或離線升級功能,為了防止升級過程出現(xiàn)意外,一般我們都會(huì)對Flash程序數(shù)據(jù)進(jìn)行校驗(yàn),常見的就是添加 CRC 校驗(yàn)信息。
    發(fā)表于 05-19 10:49 ?5080次閱讀
    <b class='flag-5'>單片機(jī)</b>Flash自檢和添加CRC<b class='flag-5'>常見方法</b>

    單片機(jī)輸出PWM脈沖有什么方法

    單片機(jī)輸出PWM脈沖有什么方法
    發(fā)表于 03-12 07:01

    單片機(jī)輸出PWM有哪些注意事項(xiàng)

    單片機(jī)輸出PWM常見方法和注意事項(xiàng)(點(diǎn)擊鏈接閱讀原文) ...
    發(fā)表于 01-11 07:54

    單片機(jī)PWM控制輸出電路

    電子發(fā)燒友為您提供了單片機(jī)PWM控制輸出電路,輸出電路的電流在4~20MA之間。希望對您的工作學(xué)習(xí)有所幫助!
    發(fā)表于 07-09 16:47 ?1.7w次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>PWM</b>控制<b class='flag-5'>輸出</b>電路

    AVR單片機(jī)定時(shí)器輸出PWM的設(shè)計(jì)及注意問題

    本內(nèi)容提供了AVR單片機(jī)定時(shí)器輸出PWM的設(shè)計(jì)及注意問題,根據(jù)PWM的特點(diǎn),在使用ATmega128的定時(shí)/計(jì)數(shù)器設(shè)計(jì)輸出
    發(fā)表于 11-09 17:39 ?1659次閱讀

    51系列單片機(jī)輸出PWM的兩種方法

    PWM利用51單片機(jī)的幾種方法,看看,挺好的
    發(fā)表于 11-13 14:41 ?11次下載

    如何利用51單片機(jī)輸出PWM

    如何利用51單片機(jī)輸出PWM波,控制電機(jī)轉(zhuǎn)動(dòng)速度
    發(fā)表于 12-31 14:26 ?230次下載

    使用51單片機(jī)輸出PWM波形的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)輸出PWM波形的程序免費(fèi)下載。
    發(fā)表于 08-29 17:29 ?68次下載
    使用51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>波形的程序免費(fèi)下載

    使用單片機(jī)PWM實(shí)現(xiàn)電壓輸出的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用單片機(jī)PWM實(shí)現(xiàn)電壓輸出的程序免費(fèi)下載。
    發(fā)表于 08-19 17:31 ?18次下載
    使用<b class='flag-5'>單片機(jī)</b><b class='flag-5'>PWM</b>實(shí)現(xiàn)電壓<b class='flag-5'>輸出</b>的程序免費(fèi)下載

    MCS-51系列單片機(jī)實(shí)現(xiàn)PWM輸出功能的方法解析

    MCS-51系列單片機(jī)PWM輸出功能,可以采用定時(shí)器配合軟件的方法實(shí)現(xiàn),對精度要求不高的場合是非常實(shí)用的。采用高速光隔6N137輸出,并將
    發(fā)表于 06-20 15:46 ?1987次閱讀

    51單片機(jī)實(shí)現(xiàn)PWM輸出功能的兩種方法解析

    51單片機(jī)沒有PWM輸出功能,可以采用定時(shí)器配合軟件的方法實(shí)現(xiàn),對精度要求不高的場合是非常實(shí)用的。采用高速光隔6N137輸出,并將
    發(fā)表于 08-22 14:51 ?2.2w次閱讀
    51<b class='flag-5'>單片機(jī)</b>實(shí)現(xiàn)<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>功能的兩種<b class='flag-5'>方法</b>解析

    使用51單片機(jī)輸出PWM方法詳細(xì)說明

     51系列單片機(jī)PWM輸出功能,可以采用定時(shí)器配合軟件的方法輸出。對精度要求不高的場合,非常實(shí)用。電路圖見圖一,采用了高速光隔(6N137
    發(fā)表于 05-13 17:54 ?39次下載
    使用51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>的<b class='flag-5'>方法</b>詳細(xì)說明

    實(shí)現(xiàn)STC單片機(jī)PWM輸出的程序免費(fèi)下載

      本文檔的主要內(nèi)容詳細(xì)介紹的是實(shí)現(xiàn)STC單片機(jī)PWM輸出的程序免費(fèi)下載。
    發(fā)表于 06-28 18:00 ?86次下載
    實(shí)現(xiàn)STC<b class='flag-5'>單片機(jī)</b><b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>的程序免費(fèi)下載

    單片機(jī)常見的打印輸出方式及區(qū)別

    單片機(jī)開發(fā)中,打印輸出比較常見,也比較重要,今天就為大家分享一下常見的打印輸出內(nèi)容以及區(qū)別。
    發(fā)表于 02-08 15:13 ?0次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>常見</b>的打印<b class='flag-5'>輸出</b>方式及區(qū)別

    單片機(jī)I/O驅(qū)動(dòng)與隔離常見設(shè)計(jì)方法

    單片機(jī)I/O驅(qū)動(dòng)與隔離常見設(shè)計(jì)方法
    的頭像 發(fā)表于 10-25 17:36 ?2246次閱讀
    <b class='flag-5'>單片機(jī)</b>I/O驅(qū)動(dòng)與隔離<b class='flag-5'>常見</b>設(shè)計(jì)<b class='flag-5'>方法</b>
    主站蜘蛛池模板: 最近最新中文字幕6页| 色综合天天综合网国产成人| 日本成人免费在线视频| 热99精品| 黄视频网站在线| 国产精品九九热| 欧美三级成人| 天天综合天天| 在线观看精品国产入口| 韩国三级理论在线观看视频 | 越南黄色录像| 天堂在线资源网| 天天做天天爱天天综合网2021| 天天色啪| 天天拍夜夜操| 国内黄色录像| 哥也操| 狠狠干夜夜爽| 激情狠狠干| 91视频观看| 69日本人xxxxxxxx色| 五月丁香| 在线观看网站国产| 亚洲光棍天堂| 李老汉和小花的性生生活| 亚洲第一区视频| 亚洲精品资源| 午夜理伦| 婷婷综合色| 婷婷丁香久久| 噜啪啪| 韩国最新三级网站在线播放| 欧美日韩国产网站| 美女网站色视频| a免费在线| 天堂资源8中文最新版在线| 高清一级| 永久黄网站色视频免费| 网全大全黄| 精品三级国产精品经典三| 国产二区三区|