127 lines
4.6 KiB
C
127 lines
4.6 KiB
C
#include "app_config.h"
|
||
#include "system/includes.h"
|
||
#include "asm/pwm.h"
|
||
#include "device/device.h"
|
||
|
||
/*********************************PWM设备例子****************************************************
|
||
注意:初始化之后,只支持单通道选择
|
||
PWM通过dev_write写,返回值为成功0,失败非0;
|
||
PWM通过dev_read读,返回值为通道的占空比值(0-100%);
|
||
PWM通过dev_ioctl控制,形参arg为PWM通道;
|
||
************************************************************************************************/
|
||
|
||
#ifdef USE_PWM_TEST_DEMO
|
||
static void pwm_test(void)
|
||
{
|
||
int ret;
|
||
u32 duty;
|
||
u32 channel;
|
||
void *pwm_dev_handl = NULL;
|
||
struct pwm_platform_data pwm = {0};
|
||
|
||
/*1.open ,open之后的PWM通道最多支持同一个通道的H和L设置,不能进行多通道的设置*/
|
||
pwm_dev_handl = dev_open("pwm1", &pwm);//打开PWM0设备,传参可以获取board.c配置的参数
|
||
if (!pwm_dev_handl) {
|
||
printf("open pwm err !!!\n\n");
|
||
return ;
|
||
}
|
||
printf("pwm : ch=0x%x,duty=%2f%%,pbit=%d,freq=%dHz\n", pwm.pwm_ch, pwm.duty, pwm.point_bit, pwm.freq);
|
||
os_time_dly(200);
|
||
|
||
/*open PWM设备之后就会初始化PWM,PWM相关参数为board.c配置,在不需要更改参数时,只需要open就行,不需要进行以下操作*/
|
||
|
||
#if 1
|
||
/*2.write and read 配置占空比*/
|
||
pwm.pwm_ch = PWMCH0_H | PWMCH0_L;//该通道需在board.c中有定义,若没有则需先PWM_ADD_CHANNEL,下面有例子。
|
||
pwm.duty = 80;
|
||
dev_write(pwm_dev_handl, (void *)&pwm, 0);
|
||
ret = dev_read(pwm_dev_handl, (void *)&pwm, 0);//dev_read函数返回值为占空比(不带小数点)0-100
|
||
printf("pwm0 read duty : %d \n", ret);
|
||
os_time_dly(200);
|
||
|
||
/*3.ioctl控制PWM暂停、运行、正反向,调用1次ioctl只支持1组通道PWMCH_H/L控制*/
|
||
printf("----pwm0 ioctl-------\n\n");
|
||
dev_ioctl(pwm_dev_handl, PWM_STOP, (u32)&pwm);//PWM停止
|
||
os_time_dly(200);
|
||
dev_ioctl(pwm_dev_handl, PWM_RUN, (u32)&pwm);//PWM运行
|
||
os_time_dly(200);
|
||
dev_ioctl(pwm_dev_handl, PWM_REVDIRC, (u32)&pwm);//PWM正向 PWMCHx_H/L才能支持
|
||
os_time_dly(200);
|
||
dev_ioctl(pwm_dev_handl, PWM_FORDIRC, (u32)&pwm);//PWM反向 PWMCHx_H/L才能支持
|
||
|
||
pwm.deathtime = 6;//最大值31 死区时间为系统时钟的(deathtime+1)倍,使用PWMCHx_H/L有效
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_DEATH_TIME, (u32)&pwm);//PWM死区时间设置
|
||
|
||
os_time_dly(200);
|
||
printf("----pwm0 set freq-------\n\n");
|
||
/*4.ioctl配置频率和占空比*/
|
||
pwm.pwm_ch = PWMCH0_H | PWMCH0_L;
|
||
pwm.freq = 2000;
|
||
pwm.duty = 20;
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_FREQ, (u32)&pwm);//设置频率
|
||
os_time_dly(200);
|
||
|
||
pwm.duty = 50;
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_DUTY, (u32)&pwm);//设置占空比
|
||
os_time_dly(200);
|
||
|
||
pwm.duty = 80;
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_DUTY, (u32)&pwm);//设置占空比
|
||
os_time_dly(200);
|
||
|
||
/*5.中途可以添加TIMER2 PWM 任意IO,添加通道后关闭前必须删除 */
|
||
printf("----timer add channel-------\n\n");
|
||
pwm.pwm_ch = PWM_TIMER2_OPCH2;
|
||
pwm.port = IO_PORTA_07;
|
||
pwm.duty = 10;
|
||
pwm.freq = 1500;
|
||
dev_ioctl(pwm_dev_handl, PWM_ADD_CHANNEL, (u32)&pwm);//中途添加通道,可以是PWMCHx_H/L和PWM_TIMER2_OPCH2或PWM_TIMER3_OPCH3
|
||
|
||
pwm.duty = 80;
|
||
dev_write(pwm_dev_handl, (void *)&pwm, 0);//dev_write也可以设置占空比
|
||
ret = dev_read(pwm_dev_handl, (void *)&pwm, 0);//读取占空比
|
||
printf("pwm0 read duty : %d \n", ret);
|
||
|
||
os_time_dly(200);
|
||
|
||
|
||
printf("----timer ioctl pwm.pwm_ch = 0x%x-------\n\n", pwm.pwm_ch);
|
||
/*6.ioctl控制PWM暂停、运行、正反向,调用1次ioctl只支持1组通道PWMCH_H/L控制*/
|
||
os_time_dly(300);
|
||
dev_ioctl(pwm_dev_handl, PWM_STOP, (u32)&pwm);//PWM停止
|
||
|
||
os_time_dly(200);
|
||
dev_ioctl(pwm_dev_handl, PWM_RUN, (u32)&pwm);//PWM运行
|
||
os_time_dly(200);
|
||
|
||
pwm.freq = 2000;
|
||
pwm.duty = 20;
|
||
printf("----timer set freq-------\n\n");
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_FREQ, (u32)&pwm);//设置频率
|
||
os_time_dly(200);
|
||
pwm.duty = 50;
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_DUTY, (u32)&pwm);//设置占空比
|
||
os_time_dly(200);
|
||
pwm.duty = 80;
|
||
dev_ioctl(pwm_dev_handl, PWM_SET_DUTY, (u32)&pwm);//设置占空比
|
||
os_time_dly(200);
|
||
|
||
/*7.关闭前把添加通道删除,*/
|
||
dev_ioctl(pwm_dev_handl, PWM_REMOV_CHANNEL, (u32)&pwm);
|
||
#endif
|
||
dev_close(pwm_dev_handl);
|
||
printf("pwm test end\n\n");
|
||
|
||
while (1) {
|
||
os_time_dly(2);
|
||
}
|
||
}
|
||
static int c_main(void)
|
||
{
|
||
os_task_create(pwm_test, NULL, 12, 1000, 0, "pwm_test");
|
||
return 0;
|
||
}
|
||
late_initcall(c_main);
|
||
|
||
#endif
|