查看: 353|回复: 3

[经验] 相位校准PWM模式PWM调制

[复制链接]
  • TA的每日心情
    擦汗
    2019-4-30 22:31
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2019-4-19 22:38 | 显示全部楼层 |阅读模式
    本帖最后由 Alan_Green 于 2019-4-22 22:49 编辑

        调制两路 PWM 用于两组管子轮流导通的场合,频率31.3kHz,占空比5% 到 45%。使用了定时器2,PWM输出为 Pin_13:OC2A,以及Pin_3:OC2B
        为了避免两个管子同时导通,占空比要小于50%;为了避免运行异常,定时器工作频率较高时(全频),占空比不能设置过小,建议计数值不小于5,本例设置计数限制在 0x0A ~ 0x73 之间,实测占空比 5% 到 45% 。。调用 PWM_set() 完成配置后,只需在 PWM_write() 里写入数值就可以控制占空比;修改PWM_write()里的 if 判断条件可以改变占空比限制。

    include <avr/io.h>

    include <avr/interrupt.h>

    byte PWM_daul = 0X08;  //全局变量,设置PWM占空比;赋值范围:0x0A ~ 0x73,占空比 5% 到 45%;

    void setup()
    {
    PWM_set();            //初始化PWM,配置定时器2;频率31.3kHz,OC2A与OC2B相差半个PWM周期;
    }

    void loop()
    {
    //增加占空比,然后减小占空比//
    for(byte i=0; i < 0x90; i++)
    {
    PWM_write(PWM_daul ++);        // 写 PWM_daul 就可以控制占空比,范围
    delay(40);
    }

    for(byte i=0; i < 0x90; i++)
    {
    PWM_write(PWM_daul --);
    delay(40);
    }

    }

    //**初始化 PWM 配置***//
    void PWM_set()
    {
    pinMode(11, OUTPUT);      //OC2A 第一路PWM
    pinMode(3, OUTPUT);        //OC2B 第二路PWM

    // ****配置定时器2*****//
    cli();                                     // 配置时关全局中断,避免配置被意外打断。
    TCCR2A = B10110001;       //10表示OC2A脚上升匹配清零;11为OC2B上升匹配置位;0001 相位矫正PWM 模式;
    OCR2A = 0x05;                   //设初始值,输出比较寄存器A  <<<<<<<<<-----
    OCR2B = 0xFE - OCR2A;    //设初始值,输出比较寄存器B  <<<<<<<<<-----
    TIMSK2 = B00000000;       //定时器2中断允许,   2:OCIE2B;1:OCIE2A;0;TOIE2;
    TCCR2B = B00000001;       //设置分频,  01不分频,10 为8分频,11 为32分频;
    sei();                                    // enable global interrupts:
    }

    //*写 PWM 占空比***//
    byte PWM_write(byte z)
    {
    if((z > 0x0A) && (z < 0x73))  //判断占空比 5% 到 45%范围内才允许写入。
    {
    OCR2A = z;
    OCR2B = 0xFE - z;     //用 0xFF 两路占空比不同步,会相差一个计数(0.5%)
    // return 0x00;           //利用返回值可以判断是否超范围。
    }
    //else return 0x01;
    }

  • TA的每日心情
    擦汗
    2019-4-30 22:31
  • 签到天数: 12 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-20 14:27 | 显示全部楼层
    波形效果视频  https://www.bilibili.com/video/av49848317
  • TA的每日心情
    擦汗
    2019-4-30 22:31
  • 签到天数: 12 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-4-26 00:14 | 显示全部楼层
    寄存机就那几个,根据需要配置。
    1556208743(1).png
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    74HC595的疑惑终于解开
    74HC595的疑惑终于解开
    对于74HC595的教程中和网上的资料看完还是模糊,于是一边接线测试,一边反复看图研究
    【Arduino】37种传感器系列实验(1)---干簧管模块
    【Arduino】37种传感器系
    37款传感器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37
    开贴讲讲NRF24L01P,让你彻底搞懂它的工作原理,持续更...
    开贴讲讲NRF24L01P,让你
    *****************************************
    Arduino MEGA 与UNO 通过nRF24L模块通讯
    Arduino MEGA 与UNO 通过n
    之前在深水宝很“实惠”的店铺买了一些原件,随手砍了esp8266以及nRF24L*3 因为缺
    体验OneNET4.0,一起来拼开发板
    体验OneNET4.0,一起来拼
    一、 活动时间2019年04月09日-2019年6月30日 二、活动链接1.登录Arduino中文社区账
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表