找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 547|回复: 1
打印 上一主题 下一主题
收起左侧

求大佬详细讲解pwm中断服务,与如何降低载波频率基波不变

[复制链接]
跳转到指定楼层
楼主
ID:1109639 发表于 2024-4-4 04:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void pwmInit()
{
        PR2=0XfE;                                        //设置pwm工作周期,20mHz,PWM周期19.5kHz
        CCP1CON=0X8C;                                //PW模式,1000  1100  P1A  P1C高电平有效 P1B,P1D高电平有效
        CCPR1L=0X00;                                //设置CCP1,0%的脉宽输出
        T2CON=0X1C;                                        //定时器2预分频1,后分频器4分频
        PWM1CON=0X03;                                //死区时间调节600ns
        TMR2IE=1;                                        //打开定时器2中断使能
        TMR2ON=1;                                        //打开定时器2
        TMR2IF=0;                                        //定时器2中断标志位清零
        adc_power=0;                                //PID调节标志初始化
        soft_count=0;
        sin_num=0;
        sin_l=0;
        sin_d=0;
        sin=0;
        m=0;
        inc=0;                                                //以上为PWM相关变量初始化
}
//----------------------中断服务程序------------------
void interrupt timer2()                   //定时器2中断
{
        if(TMR2IF&&TMR2IE)
                {
                        TMR2IF=0;
                        sin_l = SPWMTABLE[sin_num]*m;//???????
                        sin_d = sin_l/VSPWM;//????????
                        if(m>129) {m=129;}         //防止溢出
                        if(0==sin)
                                {
                                        if(!sin_num)??????
                                                {
                                                        ECCPAS=0X80;
                                                        PWM2H=0;
                                                        PWM2L=1;
                                                        ECCPAS=0;
                                                }
                                                CCPR1L=sin_d+1;
                                }
        else
                {
                        if(!sin_num)
                        {
                                ECCPAS =0X80;
                                PWM2L=0;
                                PWM2H=1;
                                ECCPAS=0;        
                        }        
            CCPR1L =~sin_d;
        }
        sin_num++;
        if(sin_num==SPWM){sin_num=0;sin++;if(sin==2){sin=0;}}        //查表
        if(sin_num==23){adv=1;}
        if(sin_num==0){adc_power=1;}
    }
}

原来的程序如上,感谢有位大佬给我分享的程序,但是我测试后发现,电压采样没反应,电流采样也没有反应,不知道为什么?
先抛开采样,以上程序是部分程序,如果想要两路载波为16k,两路基波50hz我应该如何改,还有比如我要10k载波,如何计算修改值?
还有就是以上中断服务程序是不是太过复杂,有没有更为简单的写法?,折磨了我一个星期不睡还是不明白:sin_l = SPWMTABLE[sin_num]*m;sin_d = sin_l/VSPWM;这是为什么?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301191 发表于 2024-4-9 19:20 | 只看该作者
顶一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表