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