微信公眾號?| strongerHuang
PWM:Pulse Width Modulation,脈沖寬度調(diào)制。
單片機實現(xiàn)PWM輸出的方式有很多種,有通過IO延時翻轉(zhuǎn)實現(xiàn)的,比如:
while(1)
{
IO口高電平
??Delay延時
IO口低電平
??Delay延時
}
這種方法和前面給大家分享的文章【通過RA8單片機 SysTick 實現(xiàn)延時】有點類似,但這種方法缺陷也明顯,占用CPU資源,也存在誤差,特別是us級別誤差更明顯。
也有通過定時器中斷控制IO高低電平輸出實現(xiàn)的。
定時器中斷配置 ——>?啟動定時器?——>?響應(yīng)中斷,控制IO高低電平···
當然,本文通過,瑞薩RA8D1單片機通用 PWM 定時器(GPT,General PWM Timer)輸出PWM波形,這樣既避免了占用CPU資源,又避免了誤差(精度相對很高)。
下面手把手教大家基于e2 studio環(huán)境下,實現(xiàn)RA8單片機輸出PWM的方法。
準備工作
1、下載并安裝e2 studio工具
下載地址,推薦瑞薩官方的GitHub:https://github.com/renesas/fsp/releases
我們這里基于Windows環(huán)境,安裝exe文件,基本根據(jù)提示信息一路next即可。
2、準備RA8D1開發(fā)板
我們這里以瑞薩RA8D1單片機為例(當然,其實RA系列單片機也類似):
RA8單片機PWM輸出方法
本文就瑞薩官方集成開發(fā)工具e2 studio,它是瑞薩單片機一站式編程工具,只需要動動鼠標點一點就能創(chuàng)建一個單片機工程。
1、打開e2 studio創(chuàng)建PWM項目
我們命名項目名稱為:RA8D1_PWM
選擇對應(yīng)芯片型號:R7FA8D1BEC
只需要動動鼠標“點一點”,一個完整的工程就創(chuàng)建好了。
2、配置工程
我們使用RA8D1單片機通用PWM定時器(General PWM Timer)GPT4,引腳P301輸出PWM。
這里配置時鐘、添加GPT模塊以相關(guān)配置。
配置時鐘:GPT4使用?PCLKD?分頻作為時鐘源
配置引腳:我們使用GPT4的P301作為PWM輸出引腳。
新建定時器模塊:我們添加定時器模塊并配置相關(guān)屬性(配置常用參數(shù),其實默認即可)。
3、添加源代碼
我們這里簡單添加一個gpt4模塊(源代碼文件),如圖:
bsp_gpt_pwm_output.c源代碼:
#include "bsp_gpt_pwm_output.h"
/* GPT初始化函數(shù) */
void GPT_PWM_Init(void)
{
/* 初始化 GPT 模塊 */
R_GPT_Open(&g_timer_gpt4_ctrl, &g_timer_gpt4_cfg);
/* 啟動 GPT 定時器 */
R_GPT_Start(&g_timer_gpt4_ctrl);
}
/** 設(shè)置PWM占空比
@param duty 占空比范圍:0~100 %
*/
void GPT_PWM_SetDuty(uint8_t duty)
{
timer_info_t info;
uint32_t current_period_counts;
uint32_t duty_cycle_counts;
if (duty > 100)
duty = 100; //限制占空比范圍:0~100
/* 獲得GPT的信息 */
R_GPT_InfoGet(&g_timer_gpt4_ctrl, &info);
/* 獲得計時器一個周期需要的計數(shù)次數(shù) */
current_period_counts = info.period_counts;
/* 根據(jù)占空比和一個周期的計數(shù)次數(shù)計算GTCCR寄存器的值 */
duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);
/* 最后調(diào)用FSP庫函數(shù)設(shè)置占空比 */
R_GPT_DutyCycleSet(&g_timer_gpt4_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
}
bsp_gpt_pwm_output.h頭代碼:
#ifndef __BSP_GPT_PWM_OUTPUT_H
#define __BSP_GPT_PWM_OUTPUT_H
#include "hal_data.h"
void GPT_PWM_Init(void);
void GPT_PWM_SetDuty(uint8_t duty);
#endif
我們這里只有兩個簡單函數(shù),在我們代碼中添加 GPT_PWM_Init 即可實現(xiàn)(配置中的)200KHz,占空比80%的PWM波形輸出。
4、演示效果
下圖是我們配置200KHz,占空比80%的PWM波形:
根據(jù)源碼,你能發(fā)現(xiàn),我們只需要初始化(配置好)PWM輸出,后面就不會占用CPU資源。
我們提供了一個簡單的接口,修改占空比,如果需要根據(jù)需求修改占空比,我們調(diào)用一下接口即可。比如我們修改占空比為60%:
當然,更多參數(shù),我們可以根據(jù)自己情況封裝函數(shù)接口。
好了,本文就分享到這里,希望你=對你們有所幫助。