AWorksLP 對外設進行了高度抽象化,為同一類外設提供了相同的接口,應用程序可以輕松跨平臺。本文以MR6450(點擊了解詳情)平臺為例,介紹AWorksLP PWM 外設基本用法。
?簡介
脈沖寬度調制(PWM),是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。以下簡述幾個關鍵的概念:
圖1
- PWM周期:指信號從高電平到低電平再回到高電平的時間,如上圖T所示。
- PWM頻率一秒內PWM周期的次數。
- 占空比:一個周期內高電平持續時間所占的比例即(T1 / T)。
- 脈寬時間:高電平時間。
?接口介紹
函數列表:
函數原型 | 簡要描述 |
aw_err_t aw_pwm_enable (int fd); | 使能PWM設備輸出 |
aw_err_t aw_pwm_disable (int fd); | PWM設備輸出停止 |
aw_err_t aw_pwm_accurate_output (int fd, uint32_t period_num); | 精確輸出 period_num 個周期PWM波 |
aw_err_t aw_pwm_config_set (int fd, aw_const aw_pwm_config_t *p_config); | 設置PWM設備參數配置 |
aw_err_t aw_pwm_config_get (int fd, aw_pwm_config_t *p_config); | 獲取PWM設備的配置參數 |
aw_err_t aw_pwm_config_frac_set (int fd, aw_const aw_pwm_config_frac_t *p_config); | 以更加精確的形式設置PWM設備的參數 |
aw_err_t aw_pwm_config_frac_get (int fd, aw_pwm_config_frac_t *p_config); | 獲取PWM設備的分數形式配置參數 |
下表為PWM接口相關結構體類型。
結構體類型表:
類型 | 簡要描述 |
aw_pwm_config_t | PWM配置參數結構體 |
aw_pwm_config_frac_t | PWM配置參數結構體(分數形式),用分數表示,更精確 |
PWM 配置信息說明:
1. aw_pwm_config_t
typedef struct { uint32_t duty_ns; uint32_t period_ns; uint32_t is_inverse;} aw_pwm_config_t;
PWM配置參數結構體。
成員詳解:
- duty_ns:pwm周期中高電平的有效時間 ns為單位。
- period_ns:pwm周期ns為單位。
is_inverse:輸出波形是否反相,0表示不反相。
2. aw_pwm_config_frac
typedef struct aw_pwm_config_frac {
uint32_t duty_numerator; uint32_t duty_denominator; uint32_t period_numerator; uint32_t period_denominator; uint32_t is_inverse;} aw_pwm_config_frac_t;
PWM配置參數結構體(分數形式),用分數表示,更精確。
成員詳解:
duty_numerator:PWM周期中高電平的有效時間分子部分。
duty_denominator:PWM周期中高電平的有效時間分母部分。
period_numerator:PWM周期分子部分。
period_denominator:PWM周期分母部分。
is_inverse:PWM輸出波形輸出是否反向,0:不反向,1:反向。
?使用樣例
AWorksLP SDK相關使用請參考《AWorksLP SDK快速入門(MR6450)——開箱體驗》一文,本文不在贅述。
1. PWM單通道輸出功能{SDK}\demos\peripheral\pwm路徑下為PWM例程,例程關鍵代碼如下:
/** * \brief PWM演示例程入口 * \return 無 */aw_local void* __task_handle (void *arg){ uint32_t period1 = 2000000; /* (ns) */ uint32_t period2 = 1000000; /* (ns) */ int fd; int ret; aw_pwm_config_t pwm_config;
aw_kprintf("\nPWM demo testing...\n"); fd = aw_open(CONFIG_DEMO_PWM_DEVICE_NAME, AW_O_RDWR, 0); if(fd < 0){ aw_kprintf("pwm open failed \r\n"); aw_close(fd); return 0; } ret = aw_pwm_config_get(fd, &pwm_config);
/* period 配置不可以為0 * duty配置為0,這時可以配置成功:輸出一直為低 * duty配置為peroid,占空比為100%,也可配置成功:輸出一直為高 * PWM正在進行輸出,不可配置 */ pwm_config.duty_ns = period1 / 2; pwm_config.is_inverse = 0; pwm_config.period_ns = period1; aw_pwm_config_set(fd, &pwm_config); while(1) {
/* 配置 PWM 的有效時間(高電平時間)50% ,周期 period1*/ aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250); /* 輸出五個周期pwm波*/ aw_pwm_accurate_output(fd, 5);
/* 配置 PWM 的有效時間(高電平時間)2% ,周期 period1*/ pwm_config.duty_ns = period1 / 50; aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
pwm_config.duty_ns = period2 / 2; pwm_config.period_ns = period2; /* 配置 PWM 的有效時間(高電平時間)50% ,周期 period2*/ aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
/* 配置 PWM 的有效時間(高電平時間)2% ,周期 period2*/ pwm_config.duty_ns = period2 / 50; aw_pwm_config_set(fd, &pwm_config); aw_pwm_enable(fd); /* 使能通道 */ aw_mdelay(250); aw_pwm_disable(fd); /* 禁能通道 */ aw_mdelay(250);
pwm_config.duty_ns = period1 / 2; pwm_config.period_ns = period1; }
return 0;}
例程默認使用pwm3_chan4對應開發板的位置如圖2所示:
圖2pwm排針
上述代碼中使用aw_pwm_config_get接口獲取PWM當前的配置信息,PWM周期中高電平的有效時間為1000000ns,PWM周期為2000000ns,也就是設置PWM的占空比為50%。使用aw_pwm_config_set接口設置PWM。使用aw_pwm_enable接口使能PWM,使用aw_pwm_disable接口關閉PWM,使用aw_pwm_accurate_output接口輸出任意個PWM波。
在while循環中每間隔一段時間通過設置PWM的參數,從而輸出各種PWM的波形,下圖為例程中輸出的各種PWM波形。
圖3占空比50%,周期2ms
圖4占空比2%,周期2ms
圖5占空比50%,周期1ms
圖6占空比2%,周期1ms
2.蜂鳴器輸出{SDK}\demos\peripheral\buzzer路徑下為蜂鳴器例程,例程關鍵代碼如下:
/** * \brief 建立蜂鳴器例程入口 * \return 無 */aw_local void* __task_handle (void *arg){ int fd; fd = aw_open("/dev/Buzzer", AW_O_RDWR, 0); if(fd < 0){ aw_kprintf("Buzzer open failed \r\n"); aw_close(fd); return 0; }
while(1) { /* 強度調節設備驅動無源蜂鳴器 */ aw_buzzer_loud_set(fd, 80); /* 設置蜂鳴器鳴叫強度 */ aw_buzzer_beep(fd, 500); /* 啟動蜂鳴器延時500ms */
/* GPIO驅動直流蜂鳴器 */ aw_buzzer_loud_set(fd, 50); /* 設置蜂鳴器鳴叫強度 */ aw_buzzer_on(fd); /* 啟動蜂鳴器 */ aw_mdelay(500); /* 延時500ms */ aw_buzzer_off(fd); /* 關閉蜂鳴器 */ aw_mdelay(500); /* 延時500ms */ } aw_close(fd); return 0;}
蜂鳴器在開發板上的位置如圖7所示。
圖7蜂鳴器位置
蜂鳴器引腳所對應的PWM通道為pwm3_chan1,如下圖所示。
圖8蜂鳴器對應引腳
圖9PWM對應引腳
圖10蜂鳴器對應的PWM通道
上述代碼中在while循中環使用aw_buzzer_loud_set接口設置蜂鳴器的鳴叫程度為80,相當于調節PWM的占空比。然后使用aw_buzzer_beep接口使蜂鳴器鳴叫一段時間后關閉。再設置蜂鳴器的鳴叫程度為50,使用aw_buzzer_on接口啟動蜂鳴器,相當于使能PWM,延時一段時間后用aw_buzzer_off接口關閉蜂鳴器,相當于關閉PWM,然后再延時一段時間。實驗現象為蜂鳴器先以較大的聲音鳴叫一段時間后以較小的聲音鳴叫一段時間后停止鳴叫,持續一段時間后再次循環。在PWM例程中,PWM作為設備資源被Buzzer引用,可在配置界面中查看所有可引用資源,也可以在界面中查看當前平臺所有PWM資源,以便在軟件設計過程中查看修改。本文以PWM外設通用接口為例,演示了單通道的輸出以及接口特性,同時與蜂鳴器進行設備綁定,后續將會更詳細的介紹多通道的輸出以及相關特性,請持續關注后續推文~
-
接口
+關注
關注
33文章
8584瀏覽量
151075 -
PWM
+關注
關注
114文章
5186瀏覽量
213854
發布評論請先 登錄
相關推薦
評論