搜索
bottom↓
回复: 7

51室内光线自动控制系统

[复制链接]

出0入0汤圆

发表于 2012-4-30 20:12:34 | 显示全部楼层 |阅读模式
之前用stc12c5a60s2做的一个室内光线自动控制系统。
其实说白了就是通过光敏电阻采集各个方向的光强,通过ad采集,然后分析各个方向光线强弱,然后通过pwm控制不同的灯的亮度达到控制室内光线的自动平衡。
首先我自己做了一个小的模型,就是一个光敏电阻和一个led灯。效果基本达到了,但是在光线的反馈调节上有些问题。就是通过ad采集led的光强,当led靠近ad时ad采集到的光强大,led变暗,当led变暗,ad采集的光强变弱,led又通过pwm变亮,感觉灯强一直在变动。通过设置ad值得梯度来控制led基本可以达到效果,但是感觉led有突变,不是线性。希望大家能帮忙看看。
程序如下:
#include<stc12c5a60s2.h>

#include<datatype.h>

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit wela=P2^7;

sbit dula=P2^6;



void Delay(uint xms)

{

        uint i,j;

        for(i=xms;i>0;i--)

        {

                for(j=110;j>0;j--);

        }

}



void AD_init()

{

        P1ASF=BIT1;

        P1M0=BIT1;

        P1M1=BIT1;

        ADC_CONTR=0xe0;

//        AUXR1|=BIT2;  //ADC_RES高八位 ADC_RESL 低二位

}



int GET_AD()

{

                float offset;

                ADC_CONTR|=BIT7+BIT3;

                while(!ADC_CONTR&BIT4);

                offset=((float)ADC_RES*4+(float)(ADC_RESL%0x04)); //AD结果高8位左移2位,低2位不变,然后相加

                ADC_CONTR&=~BIT4;

                return(offset);



}



void Init_pwm()

{

        CCON=0;           //PCA初始化
        CL=0;          //PCA的16位计数器低八位
        CH=0;          //PCA的16位计数器高八位
        CMOD=0x00;        //选择系统时钟12为计数脉冲 f=sysclk/12,则Pwm的频率F=f/256

        CCAP0L=0x00;  

        CCAP0H=0x00;  // 占空比控制
        PCA_PWM0=0x00; //占空比的第九位为0

        CCAPM0=0x42;  //允许P13作为PWM输出

        CR=1;         //启动PCA计数器
}

void SET_pwm(uchar n)

{

        CCAP0L=n;  

        CCAP0H=n;       

}



float AD_av()

{

        float a=0;

        uchar num;

        for(num=500;num>0;num--)

        {

                a+=GET_AD();

        }

        a/=500.0;

        a=a*5.0/1024; //原始电压值

        a=a*1000;//放大一千倍

        return(a);

}



void Display(uchar num ,uchar dat)

{

        uchar i;

        dula=0;

        P0=table[dat];

        dula=1;

        dula=0;

        wela=0;

        i=0xff;

//        i=i&(~((0x00)<<(num)));

//        P0=i;

    switch(num)

        {

                case 0:

                                P0=0xfe;

                                break;

                case 1:

                                P0=0xfd;

                                break;

                case 2:

                                P0=0xfb;

                                break;

                case 3 :

                                P0=0xf7;

                                break;

        }



        wela=1;

        wela=0;

        Delay(1);

        P0=0xff;

}



void Display_cl(float t)

{

        int i;

        i=(int)t/1000;

           Display(0,i);

        i=(int)t%1000/100;

        Display(1,i);

        i=(int)t%100/10;

        Display(2,i);

        i=(int)t%100%10;

        Display(3,i);       

}

main()

{

        float b;

        uchar l=0;

        Init_pwm();

        AD_init();

        while(1)

        {

         

        b=AD_av();



        if(b<1550)

         {

        if(l<32)l++;

        else l--;

        }

    if(1500<b&&b<1600)

        {

        if(l<64)

         l++;

    else l--;

        }

    if(1550<b&&b<1650)

        {

        if(l<96) l++;

        else l--;

        }

    if(1600<b&&b<1700)

        {

        if(l<128) l++;

        else l--;

        }

    if(1650<b&&b<1750)

        {

        if(l<160) l++;

        else l--;

        }

        if(1700<b&&b<1800)

        {

        if(l<192) l++;

        else l--;

        }

        if(1750<b&&b<1850)

        {

        if(l<224) l++;

        else l--;

        }

        if(1800<b&&b<1950)

        {

        if(l<255)

        {l++;if(l>=255) l=255;}

        else l--;

        }

        if(b>1950) l=255;

        else  l--;

        SET_pwm(l);

        Display_cl(b);

       

        }

}



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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-4-30 21:13:57 | 显示全部楼层
AD采集进行滤波处理,而且不要一变化就马上就做出反应

出0入0汤圆

 楼主| 发表于 2012-5-1 11:34:11 | 显示全部楼层
raxb 发表于 2012-4-30 21:13
AD采集进行滤波处理,而且不要一变化就马上就做出反应

你说的滤波是指?我对ad采样取了多次平均啊。效果不好

出0入17汤圆

发表于 2012-5-1 11:45:34 | 显示全部楼层
加入PID控制。

出0入0汤圆

 楼主| 发表于 2012-5-1 14:20:29 | 显示全部楼层
wicy001 发表于 2012-5-1 11:45
加入PID控制。

这个不会额、、只是在小车里面听说过pid算法。

出0入17汤圆

发表于 2012-5-1 18:01:47 | 显示全部楼层
PID很简单,网上查查PID的资料,主要看看PID的算法,自己照着算法编程就可以了。

PID控制与应用环境无关,无论是小灯,还是电机,还是变频器,都可以控制。

出0入0汤圆

 楼主| 发表于 2012-5-1 20:05:28 | 显示全部楼层
wicy001 发表于 2012-5-1 18:01
PID很简单,网上查查PID的资料,主要看看PID的算法,自己照着算法编程就可以了。

PID控制与应用环境无关, ...

谢谢,嘻嘻 试试

出0入0汤圆

发表于 2012-9-6 18:41:01 | 显示全部楼层
实用价值有吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 18:15

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

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