标题: 关于PIC16F716单片机中断服务程序的几个疑问 [打印本页]

作者: 挽尘    时间: 2024-4-4 14:08
标题: 关于PIC16F716单片机中断服务程序的几个疑问
原来的程序如下,感谢有位大佬给我分享的程序,但是我测试后发现,电压采样没反应,电流采样也没有反应,不知道为什么?
先抛开采样,以上程序是部分程序,如果想要两路载波为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;}
    }
}


作者: 挽尘    时间: 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的基波?
作者: Y_G_G    时间: 2024-4-5 22:54
首先,这是PIC的片上PWM,用PIC的人很少,所以,能帮人的人可能就少了
你只能是自己去这个单片机的数据手册,慢慢的调试了
作者: bedz    时间: 2024-7-2 17:28
1.对照手册改一下PWM配置寄存器值就行

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

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

具体配置看看16f716手册!

2.PNG (30.39 KB, 下载次数: 19)

2.PNG

03.PNG (23.08 KB, 下载次数: 22)

03.PNG

捕获.PNG (173.04 KB, 下载次数: 22)

捕获.PNG





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1