BL602 PWM的使用

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 %d\r\n",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);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dear_Wally

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值