概述
本篇文章主要介紹如何使用e2studio對瑞薩單片機(jī)定時(shí)器輸入捕獲,同時(shí)輸入一個(gè)PWM驗(yàn)證是否正確。 需要樣片的可以加qun申請:615061293 。
完整代碼下載
https://download.csdn.net/download/qq_24312945/85043457
樣品申請
https://www.wjx.top/vm/wBbmSFp.aspx#
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開發(fā)板,這里我準(zhǔn)備的是芯片型號R7FAM2AD3CFP的開發(fā)板:
開發(fā)板
新建工程
工程模板
保存工程路徑
芯片配置
本文中使用R7FA4M2AD3CFP來進(jìn)行演示。
工程模板選擇
時(shí)鐘設(shè)置
開發(fā)板上的外部高速晶振為12M,需要修改XTAL為12M.
UART配置
點(diǎn)擊Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。
UART屬性配置
由于開發(fā)板的typc-c接口所接的是串口9,故配置為通道9。
回調(diào)函數(shù)user_uart_callback ()
發(fā)送完畢可以用UART_EVENT_TX_COMPLETE進(jìn)行判斷。
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
if(p_args->event == UART_EVENT_TX_COMPLETE)
{
uart_send_complete_flag = true;
}
}
設(shè)置e2studio堆棧
e2studio的重定向printf設(shè)置
C++ 構(gòu)建->設(shè)置->GNU ARM Cross C Linker->Miscellaneous去掉Other linker flags中的 “--specs=rdimon.specs”
printf輸出重定向到串口
打印最常用的方法是printf,所以要解決的問題是將printf的輸出重定向到串口,然后通過串口將數(shù)據(jù)發(fā)送出去。 注意一定要加上頭文件#include
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
if(FSP_SUCCESS != err) __BKPT();
while(uart_send_complete_flag == false){}
uart_send_complete_flag = false;
return ch;
}
int _write(int fd,char *pBuffer,int size)
{
for(int i=0;ireturn size;
}
選擇定時(shí)器
PWM(脈沖寬度調(diào)制)
脈沖寬度調(diào)制是一種模擬控制方式,根據(jù)相應(yīng)載荷的變化來調(diào)制晶體管基極或MOS管柵極的偏置,來實(shí)現(xiàn)晶體管或MOS管導(dǎo)通時(shí)間的改變,從而實(shí)現(xiàn)開關(guān)穩(wěn)壓電源輸出的改變。這種方式能使電源的輸出電壓在工作條件變化時(shí)保持恒定,是利用微處理器的數(shù)字信號對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。脈沖寬度調(diào)制是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中。 在瑞薩RA系列MCU中有兩種定時(shí)器,一種是通用PWM定時(shí)器GPT,另外一種是異步通用定時(shí)器AGT。 頻率=主頻/period +占空比=cycle/period
定時(shí)器配置
點(diǎn)擊Stacks->New Stack->Driver->Timers->Timer Driver on r_gpt。
定時(shí)器輸出PWM配置
設(shè)置PWM輸出,輸出頻率為1kHz,占空比為80%。
定時(shí)器輸入捕獲配置
點(diǎn)擊Stacks->New Stack->Driver->Timers->Timer Driver on r_gpt。
定時(shí)器輸入捕獲配置
設(shè)置定時(shí)器輸入捕獲,由于需要讀取PWM的占空比和頻率,故需要設(shè)置上升沿和下降沿都產(chǎn)生一個(gè)捕獲中斷。
工程文件
打開hal_entry.c,可以看到在hal_entry函數(shù)內(nèi),注釋著可以在這輸入自己的代碼。
占空比與頻率計(jì)算
占空比=(t1-t0)/(t2-t0) 頻率=(t2-t0)/時(shí)鐘頻率= =(t2-t0)/50M
回調(diào)函數(shù)tim_callback()
由于設(shè)置了上升沿和下降沿都會進(jìn)入回調(diào)函數(shù)中,故需要判斷引腳電平來判斷是屬于高電平還是低電平。
bsp_io_level_t p_port_value_port_101;
/*讀取端口電平狀態(tài),如果是低電平則發(fā)生的是下降沿,高電平則是上升沿*/
R_IOPORT_PinRead(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_01, &p_port_value_port_101);
周期需要2個(gè)上升沿去判斷,設(shè)定第一個(gè)上升沿time_flag由0變?yōu)?,則第二個(gè)上升沿則為time_flag由1變?yōu)?. 計(jì)算周期需要注意定時(shí)器周期計(jì)數(shù)器溢出,若存在time_flag= 0->1讀取的計(jì)數(shù)值大于time_flag= 1->0讀取的計(jì)數(shù)值,則一個(gè)周期為g_capture_num=current_period_counts+g_capture_num1-g_capture_num0。 若沒有溢出,則g_capture_num=g_capture_num1-g_capture_num0。
頻率則需要計(jì)算下降沿到time_flag=1的一個(gè)周期,在除以g_capture_num(50M)。 計(jì)算頻率需要注意定時(shí)器周期計(jì)數(shù)器溢出,若存在time_flag= 0->1讀取的計(jì)數(shù)值大于g_capture_duty_cycle_num0讀取的計(jì)數(shù)值,則一個(gè)周期為g_capture_num=current_period_counts+g_capture_num1-g_capture_num0。 若沒有溢出,則g_capture_duty_cycle_num=g_capture_duty_cycle_num0-g_capture_num0。
完整代碼下載
https://download.csdn.net/download/qq_24312945/85043457
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44489瀏覽量
631958 -
瑞薩
+關(guān)注
關(guān)注
34文章
22282瀏覽量
85938 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3231瀏覽量
114325
發(fā)布評論請先 登錄
相關(guān)推薦
評論