429|2

510

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

【匠芯创D133CBS】--4.PWM驱动蜂鸣器 [复制链接]

 
本帖最后由 dirty 于 2024-8-17 12:25 编辑

      本篇讲述PWM驱动板载蜂鸣器使用不同占空比鸣叫。

 

一.硬件原理

      开发板蜂鸣器原理如下,这里使用到PWM1配置引脚,需4KHz PWM驱动。

图1:蜂鸣器原理

 

二.代码准备

1.命令scons --menuconfig配置使能PWM驱动选项,否则出现编译不过问题 

2.PWM初始化。这里配置为脉冲周期4KHz,x需将宏定义参数设定为250000,在驱动函数里会用到。

#define LED_PIN             "PD.0"         
#define KEY_PIN             "PD.15"  

#define BUZZER_PIN          "PE.11"
#define BUZZER_PWM_CH       1
#define BUZZER_FREQ_PARAM   250000

void app_data_init(void)
{
    memset(&msg_control_t,0,sizeof(msg_control));
}

void app_key_init(void)
{
    // 1.get pin number
    static u32 pin = 0;

    pin = rt_pin_get(KEY_PIN);
    printf("Key pin%d\n",pin);
    // 2.set pin mode to Input-PullUp
    rt_pin_mode(pin, PIN_MODE_INPUT_PULLUP);

    // 3.attach irq handler
    rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING,key_irq_handler, &pin);//PIN_IRQ_MODE_RISING_FALLING

    // 4.enable pin irq
    rt_pin_irq_enable(pin, PIN_IRQ_ENABLE); 

    rt_kprintf("%s\r\n",__func__);   

}

void app_led_init(void)
{
    // 1.get pin number
    static u32 pin = 0;
    pin = rt_pin_get(LED_PIN);
    printf("Led pin%d\n",pin);
    // 2.set pin mode to Output
    rt_pin_mode(pin, PIN_MODE_OUTPUT);

    rt_kprintf("%s\r\n",__func__); 

}

void app_pwm_init(void)
{

    struct aic_pwm_action action0 = {
        /*       CBD,          CBU,          CAD, */
        PWM_ACT_NONE, PWM_ACT_NONE, PWM_ACT_NONE,
        /*      CAU,           PRD,         ZRO  */
        PWM_ACT_LOW,  PWM_ACT_NONE, PWM_ACT_HIGH};
    struct aic_pwm_action action1 = {
        /*       CBD,          CBU,          CAD, */
        PWM_ACT_NONE, PWM_ACT_LOW, PWM_ACT_NONE,
        /*      CAU,           PRD,         ZRO  */
        PWM_ACT_NONE, PWM_ACT_NONE,  PWM_ACT_HIGH};

    hal_pwm_init();
    hal_pwm_ch_init(BUZZER_PWM_CH, PWM_MODE_UP_COUNT, 0, &action0, &action1);

    hal_pwm_enable(BUZZER_PWM_CH);

    rt_kprintf("%s\r\n",__func__); 
    //Freq:4KHz
    // hal_pwm_set(BUZZER_PWM_CH, 0, BUZZER_FREQ_PARAM,PWM_SET_CMPA_CMPB);

}

void app_peripheral_init(void)
{
    app_data_init();
    app_key_init();
    app_led_init();
    app_pwm_init();
}

3.创建消息队列与任务,在按键中断回调里发送消息队列(如前一篇所述),每次控制蜂鸣器的PWM增加10%占空比。在接收消息队列任务里实现蜂鸣器PWM不同占空比控制驱动

typedef struct 
{
    uint16_t    msg_len;
    uint8_t     led_value;
    uint8_t     buzzer_pwm_percent;
}msg_control;



static void key_irq_handler(void *args)
{
    unsigned int ret;
    u32 pin = *((u32 *)(args));

    printf("Key INT\r\n");
    msg_control_t.msg_len=sizeof(msg_control_t);
    msg_control_t.led_value=!msg_control_t.led_value;
    msg_control_t.buzzer_pwm_percent+=10;
    if(msg_control_t.buzzer_pwm_percent>100)
    {
        msg_control_t.buzzer_pwm_percent=0;

    }

    app_msg_send(&msg_control_t,sizeof(msg_control_t));
}


void app_thread_entry(void *parameter)
{

    int pin;  
    msg_control msg_control_p;
    while(1)
    {


        if(rt_mq_recv(&user_mq, &msg_control_p, sizeof(msg_control_p), RT_WAITING_FOREVER)==RT_EOK)
        {
            rt_kprintf("Receive msg quene\r\n");
            
            rt_kprintf("msg_len:%d,led_value:%d,buzzer_pwm_percent:%d%%\r\n",\
                    msg_control_p.msg_len,msg_control_p.led_value,msg_control_p.buzzer_pwm_percent);


            pin = rt_pin_get(LED_PIN);
            rt_pin_write(pin, msg_control_p.led_value);
            
            hal_pwm_set(BUZZER_PWM_CH, msg_control_p.buzzer_pwm_percent*BUZZER_FREQ_PARAM/100, BUZZER_FREQ_PARAM,PWM_SET_CMPA_CMPB);


        }
        
    }
}

 

三.测验

      编译烧录,可以观察听到蜂鸣器不同鸣叫,在占空比0%和100%时,蜂鸣器是不鸣叫的,视频如下。串口日志如下

图2:蜂鸣器控制串口日志

      至此,实现驱动蜂鸣器功能。

 

Buzzer

 

最新回复

 开发板蜂鸣器是有源的还是无源的  ?   详情 回复 发表于 2024-8-17 19:28
点赞 关注
个人签名

保持热爱

 
 

回复
举报

6483

帖子

10

TA的资源

版主

沙发
 

 开发板蜂鸣器是有源的还是无源的  ?

点评

无源  详情 回复 发表于 2024-8-17 19:46
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

510

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
秦天qintian0303 发表于 2024-8-17 19:28  开发板蜂鸣器是有源的还是无源的  ?

无源

个人签名

保持热爱

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表