搜索
bottom↓
回复: 90

Proteus仿真温控,AVR输出PWM控制,1602显示。PID学习绝佳范例。

  [复制链接]

出0入0汤圆

发表于 2012-5-16 23:05:00 | 显示全部楼层
哥,你太牛叉了,请教个问题,你的图还可以在上面添加波形吗?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-5-23 21:27:15 | 显示全部楼层
本帖最后由 huangfan 于 2012-5-23 21:44 编辑

首先感谢楼主的设计实例,使我受益良多,就是根据楼主提供的Proteus模型,我自己重新用GCC写了一个程序。因为已经5年没写程序了,每天下班后的全部时间都用来研究这个东东,每天都要凌晨1点多才能睡觉,还好,只用了一周的时间就小有成果,很开心。我是个做开关电源的,最近半年做一个3KW的全数字开关电源,芯片用的是TI的TMS32C2XXX系列。因为和软件同事配合一起研究了几个月的数字PID。自认为已经掌握了“核心科技”。现在利用楼主的电路小试牛刀,感觉很满意。愿意和大家一起讨论,欢迎拍砖。我没有修改加热器的任何参数,效果如下
算法参数1:Un=Un_1+1800.002*en-1799.998*en_1;

算法参数2:Un=Un_1+1800.005*en-1799.995*en_1;


楼主的波形:


要是有更好的控制方式请赐教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-23 21:33:37 | 显示全部楼层
本帖最后由 huangfan 于 2012-5-23 21:36 编辑

限于篇幅,显示程序就不贴了

/*ADC采集,单次模式*/
uint Adconvert()
{
    uint ret;
         
        SREG=0x80;                                    // 全局中断使能
        ADMUX=0xC0;                                   //内部2.56V,0通道
        //ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIE)|_BV(ADPS2)|_BV(ADPS1);     
               //ADC使能,开始转换,连续转换,中断使能,,CK/64 8M/64=125KHz ,125KHz-8us,8us*13=104us 采样频率9.615KHz
    ADCSRA=_BV(ADEN)|_BV(ADSC)|_BV(ADPS2)|_BV(ADPS1);
               //ADC使能,开始转换,CK/64 8M/64=125KHz ,125KHz-8us,8us*25=200us
               
                //连续转换1次
                        PORTD|=_BV(PD0);                      //PD0 置0                                                            测试AD转换时间
                DDRD|=_BV(PD0);                       //PD0 设输出
                        //_delay_loop_1(60);
                        while(ADCSRA&_BV(ADSC))
                        //_delay_loop_1(60);
                        _delay_us(1);                         //采样保持时间〉1.5个ADC周期
                        ret=ADCL;
                        ret|=(uint)(ADCH<<8);
                       
                        PORTD&=~_BV(PD0);                     //PD0 置0
               
                SREG=0x80;                                         //开总中断
                ADCSRA=0;                                  //关闭ADC

        return(ret);
}

/*差分方程运算*/
SIGNAL(SIG_OUTPUT_COMPARE2)                       //INTERRUPT
{  
        //int32_t Vref=2500;                          //Vref=Ref*2.5=400*2.5=2.000V     
        //int32_t Ref=Vref/2.5;
        int32_t Ref=999;
        en=Ref-Adconvert();
               
        PORTD|=_BV(PD1);                              //示波器测试点开                                                      测试计算时间
        DDRD=_BV(PD1)|_BV(PD5)|_BV(PD6);
       
                en=en<<10;                                //en左移10位,相当于乘以1024
                Un=Un_1+1800.005*en-1799.995*en_1;        //差分方程
        if(Un<0)                                      //设置最小占空比
        {Un=2;}
       
        else if(Un>1020*1024)                         //设置最大占空比
        {Un=1020*1024;}
       
        //else
        //{Un=Un;}
       
                Un_1=Un;
                en_1=en;
                y=Un>>10;
                OCR1A=y;                                   // 设置PWM占空比               
               
        PORTD&=~_BV(PD1);                                   //示波器测试点关                        
                y=2.5*y;
       
        NO1=y/1000;
                NO2=(y-=NO1*1000)/100;
                NO3=(y-=NO2*100)/10;
                NO4=(y-=NO3*10);
       
}


void main(void)
{
        uint i,t;
    init_devices();
        LCD_write_command(0x01);                        //清屏
       
        /*配置C/T2为CTR模式*/
        TCNT2=0x00;                        //设初始值为0,
        OCR2=255;           //输出比较寄存器            //产生频率为1/[(OCR2+1)*4uS]
        TCCR2|=_BV(WGM21)|_BV(CS21)|_BV(CS20);                //C/T2中断,CTC模式,clk/64 产生周期 T=(OCR2+1)*(64/(2*8MHz))=(OCR2+1)*4uS
        TIMSK|=_BV(OCIE2);        //T/C2溢出中断使能
       
        /*配置C/T1为快速PWM模式*/
        //TCCR1A=_BV(COM1A1)|_BV(COM1A0)|_BV(WGM10);        //比较匹配时,OCnA输出高电平,8位快速PWM,模式 5
        TCCR1A=_BV(COM1A1)|_BV(WGM11)|_BV(WGM10);                //比较匹配时,OCnA输出高电平,10位快速PWM,模式 5
        TCCR1B=_BV(WGM12)|_BV(CS10);                                        //无预分频,8MHz/1024=7.813KHz
        TCNT1=0;                                        //与OCR1A进行匹配的计数寄存器
    SREG=0x80;                                          //开总中断
   
        DDRB|=_BV(PD5);                                        //设PD5为PWM输出       

   while(1)
   {   
                LCD_write_command(0x0c);                                          //显示开
                LCD_write_string(0,0,"Voltage");                 //第1列,第0行,显示"Voltage"
               
                uchar a[]="0123456789.";                                        //要显示数放在a[]中

                LCD_write_char(0,1,a[NO1]);                               //第0列,第1行,
                LCD_write_char(1,1,a[10]);                               //第1列,第1行,
                LCD_write_char(2,1,a[NO2]);                               //第2列,第1行,显示"."
                LCD_write_char(3,1,a[NO3]);                               //第3列,第1行,
                LCD_write_char(4,1,a[NO4]);                       //第4列,第1行,
                /* delay time is 20ms*25=500ms */
                for(i=1;i<1;i++)
                        //_delay_us(20);                        //The maximal possible delay is 768 us / F_CPU in MHz .    768us/8     =96us
                        _delay_ms(100);                          //The maximal possible delay is 262.14 ms / F_CPU in MHz.  262.14ms/8  =32.767ms
    }
   
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 09:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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