概述
1、我们直接调用官方的库即可,主要以下几个函数
//PWM恢复默认值
//id: PWM的id,一共支持5组PWM,范围0~4
int hal_pwm_deinit(uint8_t id)
//PWM初始化
//id: PWM的id,一共支持5组PWM,范围0~4
//pin: PWM的管脚
int hal_pwm_init(uint8_t id, int pin)
//PWM占空比设置
//id: PWM的id,一共支持5组PWM,范围0~4
//duty: 占空比(分度是100,范围0~10000,即5000时为50%)
//duration_ms: 持续时间(设为0即可)
int hal_pwm_duty_set(uint8_t id, uint32_t duty, uint32_t duration_ms)
//PWM频率设置(默认是2khz)
//id: PWM的id,一共支持5组PWM,范围0~4
//freq:频率(范围611~40000,单位HZ)
int hal_pwm_freq_update(uint8_t id, uint32_t freq)
//PWM开始
//id: PWM的id,一共支持5组PWM,范围0~4
int hal_pwm_start(uint8_t id)
//PWM停止
//id: PWM的id,一共支持5组PWM,范围0~4
int hal_pwm_stop(uint8_t id)
这些函数属于hal_drv模块,因此我们需要把工程路径下的Makefile文件中的INCLUDE_COMPONENTS字段添加hal_drv
2、BL602/BL604共有五组PWM,其中GPIO与PWM对应的关系如下图:
3、下面我们创建一个PWM任务,IO0接LED管脚,并实现呼吸灯效果
//PWM编号
#define PWM0 0
#define PWM1 1
#define PWM2 2
#define PWM3 3
#define PWM4 4
//5组PWM固定以下管脚
#define PWM0_GPIO_0 0
#define PWM0_GPIO_5 5
#define PWM0_GPIO_20 20
#define PWM1_GPIO_1 1
#define PWM1_GPIO_11 11
#define PWM1_GPIO_21 21
#define PWM2_GPIO_2 2
#define PWM2_GPIO_12 12
#define PWM2_GPIO_17 17
#define PWM2_GPIO_22 22
#define PWM3_GPIO_3 3
#define PWM3_GPIO_8 8
#define PWM4_GPIO_4 4
#define PWM4_GPIO_14 14
/********************************************************************
*@brief PWM任务
*@input
*@return
********************************************************************/
static void user_pwm_task(void *arg)
{
//PWM恢复默认值
//id: PWM的id,一共支持5组PWM,范围0~4
hal_pwm_deinit(PWM0);
//PWM初始化
//id: PWM的id,一共支持5组PWM,范围0~4
//pin: PWM的管脚,
hal_pwm_init(PWM0,PWM0_GPIO_0);
//PWM占空比设置
//id: PWM的id,一共支持5组PWM,范围0~4
//duty: 占空比(分度是100,范围0~10000,即5000时为50%)
//duration_ms: 持续时间(设为0即可)
hal_pwm_duty_set(PWM0,5000,0);
//PWM频率设置(默认是2khz)
//id: PWM的id,一共支持5组PWM,范围0~4
//freq:频率(范围611~40000,单位HZ)
hal_pwm_freq_update(PWM0,1000);
//PWM开始
//id: PWM的id,一共支持5组PWM,范围0~4
hal_pwm_start(PWM0);
bool flag = 0;
while(1)
{
vTaskDelay(10/portTICK_RATE_MS);
//下面实现呼吸灯效果
uint32_t p_duty;
hal_pwm_duty_get(PWM0,&p_duty);
// printf("p_duty %drn",p_duty);
if(flag)
{
if(p_duty >= 10000)
{
flag = 0;
p_duty = 9900;
}
else{
p_duty += 100;
}
}
else
{
if(p_duty == 0)
{
flag = 1;
p_duty = 100;
}
else{
p_duty -= 100;
}
}
hal_pwm_duty_set(PWM0,p_duty,0);
}
vTaskDelete(NULL);
}
/********************************************************************
*@brief PWM初始化
*@input
*@return
********************************************************************/
void user_pwm_init()
{
xTaskCreate(user_pwm_task, "", 512, NULL, 2, NULL);
}
最后
以上就是能干路人为你收集整理的BL602 PWM的使用的全部内容,希望文章能够帮你解决BL602 PWM的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复