找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 692|回复: 3
收起左侧

关于PIC16F716单片机中断服务程序的几个疑问

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

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;}
    }
}

回复

使用道具 举报

ID:1109639 发表于 2024-4-4 20:37 | 显示全部楼层
if(sin_num==SPWM){sin_num=0;sin++;if(sin==2){sin=0;}} 如果我把码表点数取为100点,在这里如我把sin_num==SPWM,改为sin_num==40的时候能输出50hz的基波,如果不改则只有20hz的基波?
回复

使用道具 举报

ID:401564 发表于 2024-4-5 22:54 | 显示全部楼层
首先,这是PIC的片上PWM,用PIC的人很少,所以,能帮人的人可能就少了
你只能是自己去这个单片机的数据手册,慢慢的调试了
回复

使用道具 举报

ID:39072 发表于 2024-7-2 17:28 | 显示全部楼层
1.对照手册改一下PWM配置寄存器值就行

2.采集不到电压值是因为ADC参考电压和采集通道配置有误!

3.电流采集代码也有误!

具体配置看看16f716手册!

2.PNG
03.PNG
捕获.PNG
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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