圣龙扬特-AVR电子

标题: 基于M8的数控电源 [打印本页]

作者: sunany    时间: 2013-2-28 23:17
标题: 基于M8的数控电源
用M8制作的电源,
电源含三路输出:
正负15V/200mA固定输出
5V/3A固定输出
1.5-12V/1A可调输出
可显示电压、电流,电路中采用了烧包的数字电位器。


作者: admin    时间: 2013-3-1 00:12
如果有各部分的电路及程序原理,那就绝了。

电路及程序楼主已贴在12层。
作者: c_avr128    时间: 2013-3-1 12:31
做的线性电源?不错,不错!恭喜恭喜!机箱也是你设计的哇?
作者: sunany    时间: 2013-3-1 12:34
等我有时间了我把电路图和源代码整理下再发出来
作者: 小涛电子工作室    时间: 2013-3-1 13:02
外壳不错 液晶那个孔是手开的还是机开的 不错
作者: 铜河    时间: 2013-3-1 14:10
做的漂亮~~~~~~~
作者: I'm51    时间: 2013-3-1 16:03
喜欢,so mark
作者: 小顺    时间: 2013-3-1 22:50
这板子刻得蛮好的,学习。。。
作者: 多啦A梦    时间: 2013-3-2 12:59
王手艺十三香      板刻的真好!!
作者: 尘起风扬    时间: 2013-3-2 20:45
很骚包啊
作者: Helloafer    时间: 2013-3-2 21:01
电路板是怎么做的?什么材料,工具,简要的步骤
作者: sunany    时间: 2013-3-3 14:36
M8控制板原理图
作者: sunany    时间: 2013-3-3 14:40
电源功率板,采用LM317及78H05
作者: sunany    时间: 2013-3-3 14:42
PCB板,可用单层板DIY
作者: sunany    时间: 2013-3-3 14:50
// ICC-AVR application builder :
// Target : M8
// Crystal: 8.0000Mhz
// Author: Eagle Studio

#include <iom8v.h>
#include <macros.h>
#include <math.h>
#include "init.h"
#include "LCD1602_H4.h"

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

uint ADC_data[2]={0};        //四通道AD转换值

uint ADC0_temp[10]={0};
uint ADC1_temp[10]={0};

uchar data[4]={48,48,48,48};

unsigned char flag_timer0_1s=0;
unsigned char  coder_num=1;

/******************************* ADC Convert function ******************************/
uint ADC_Convert(void)
{
    uint temp1,temp2;
    temp1=(uint)ADCL;
    temp2=(uint)ADCH;
    temp2=(temp2<<8)+temp1;
    return(temp2);
}
   
void AD_conversion(void)
{
    unsigned int i;
    unsigned char j;
    ADCSRA = 0xe3;                     //star ADC mode,
    ACSR=(1<<ACD);                     //关闭模拟比较器                  
    ADMUX=0x00;                        //选择外部AREF为基准,REF=2.75V
    for(j=0;j<10;j++)
    {
        ADMUX &=0xFE;
        delay_us(25);
        ADC0_temp[j]=ADC_Convert();
        delay_us(25);
        ADMUX |=0x01;
        delay_us(25);
        ADC1_temp[j]=ADC_Convert();
        delay_us(10);
    }
    ADCSRA = 0x00;           //disable adc
    ADC_data[0]=Avg_ADC(ADC0_temp);
    ADC_data[1]=Avg_ADC(ADC1_temp);
}       
       
/* ****************************************************************
** 函 数  名: Avg_ADC(uint *data )
** 功能描述: 中值滤波
*************************************************************** */
unsigned int Avg_ADC(unsigned int *data )
{   
    unsigned char count,i,j;
    unsigned int value_buf[10];
    unsigned long sum=0,temp;
       
    for (count=0;count<10;count++)
    {
        value_buf[count] =data[count];
    }
       
    for (j=0;j<9;j++)
    {
        for (i=0;i<9-j;i++)
        {
            if ( value_buf[i]>value_buf[i+1] )
            {
                temp = value_buf[i];
                value_buf[i] = value_buf[i+1];
                value_buf[i+1] = temp;
            }
        }
    }
   
   for(count=1;count<9;count++)
   {
           sum += value_buf[count];
   }
   
   sum =sum>>3;
   return (unsigned int)sum;
}

/******************Write LCD function******************/
void LCD_Display(void)
{
     LCD1602_sendstr(0,0,"U:",2);
     LCD1602_sendstr(0,6,"v",1);
     LCD1602_sendstr(0,8,"I:",2);
     LCD1602_sendstr(0,13,"mA",2);
     LCD1602_sendstr(1,0,"u:",2);
     LCD1602_sendstr(1,6,"v",1);
     LCD1602_sendstr(1,8,"Co:",3);
}

void Data_to_ASCII(unsigned int i,unsigned char *data)
{
   data[0]=i/1000+48;
   i=i%1000;
   data[1]=i/100+48;
   i=i%100;
   data[2]=i/10+48;
   i=i%10;
   data[3]=i+48;
}

unsigned int Process_U0(void)
{
    unsigned int I,U;
        //I=(ADC_data[1]-ADC_data[0])*2750/102400  //REF为2.75V,采样电阻为100mΩ
        //I=(ADC_data[1]-ADC_data[0])*55/2048;     //理论值
        //U=ADC_data[0]*13.4;                      //理论值 ,电压放大4.99倍   
        I=(ADC_data[1]-ADC_data[0])*7/256;         //修正值
        U=ADC_data[0]*16.64;                       /修正值  
       
        if(U>9999)
        {
            U=U/10;
            Data_to_ASCII(U,data);
            CD1602_sendstr(0,2,&data[0],1);
            LCD1602_sendstr(0,3,&data[1],1);
            LCD1602_sendstr(0,4,".",1);
            LCD1602_sendstr(0,5,&data[2],1);
        }
        else
        {
            Data_to_ASCII(U,data);
            LCD1602_sendstr(0,2,&data[0],1);
            LCD1602_sendstr(0,3,".",1);
            LCD1602_sendstr(0,4,&data[1],1);
            LCD1602_sendstr(0,5,&data[2],1);
        }
       
        Data_to_ASCII(I,data);
        LCD1602_sendstr(0,10,data,3);
}

unsigned int Process_U1(void)
{
    unsigned int U;
        U=ADC_data[1]*16.64;                 //修正值  
       
        if(U>9999)
        {
            U=U/10;
            Data_to_ASCII(U,data);
            LCD1602_sendstr(1,2,&data[0],1);
            LCD1602_sendstr(1,3,&data[1],1);
            LCD1602_sendstr(1,4,".",1);
            LCD1602_sendstr(1,5,&data[2],1);
        }
        else
        {
            Data_to_ASCII(U,data);
            LCD1602_sendstr(1,2,&data[0],1);
            LCD1602_sendstr(1,3,".",1);
            LCD1602_sendstr(1,4,&data[1],1);
            LCD1602_sendstr(1,5,&data[2],1);
        }
}

/******************Timer0 interrupt function******************/
#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF  //8ms溢出中断
void timer0_ovf_isr(void)
{
        static uint CNT0=0;
       
        TCNT0 = 0x06;           //reload counter value
        CNT0++;

        if(CNT0==125)           //askdistance flag,every 2s once
        {
            CNT0=0;
            flag_timer0_1s=1;
        }
}
  
#pragma interrupt_handler timer1_ovf_isr:9     
void timer1_ovf_isr(void)
{
    //static uint CNT0=0;
    //TIMER1 has overflowed
    TCNT1H = 0xFF;  //reload counter high value
    TCNT1L = 0xFE; //reload counter low value
    //coder_num++;
        if(CoderA_Read==0)//==0x00)       //Forward
    {
                coder_num=coder_num+1;
                if(coder_num>30)
                {
                    coder_num=30;
                }
        }
        if(CoderA_Read==1)//==0x10)       //Forward
    {
            coder_num=coder_num-1;
                if((coder_num<1)||(coder_num>30))
                {
                    coder_num=0;
                }
        }
}
   
void SPI_MasterTransmit(unsigned char data)
{
    SPDR = data;                 //启动命令传输
    while(!(SPSR & (1<<SPIF)))   //等待传输结束
    ;
}

void SPI_Max5484_Data(unsigned int Max5481_data)
{
    unsigned char tempH,tempL;
        Max5481_data=Max5481_data<<6; //将D9移到最高位,所有往高位移6位
        tempH=Max5481_data>>8;        //取高八位
        tempL=Max5481_data;           //取低八位,强制转换
       
        SPI_CS_L;                     //启动从机芯SPI模式
    SPI_MasterTransmit(0x00);        //发送写数据命令
        SPI_MasterTransmit(tempH);   //发送高八位
        SPI_MasterTransmit(tempL);    //发送低八位
        SPI_CS_H;                    //关闭从机芯SPI模式
}

void SPI_Max5484_Cmd(unsigned char Max5481_cmd)
{
    SPI_CS_L;                        //启动从机芯SPI模式
    SPI_MasterTransmit(Max5481_cmd);
        SPI_CS_H;                    //关闭从机芯SPI模式
}


/****************************main function*******************************/
void main(void)
{
init_devices();  //system init
LCD1602_init();
delay_ms(500);
LCD1602_clear();
LCD1602_sendstr(0,2,"Hello world!",12);
LCD1602_sendstr(1,2,"Eagle Studio",12);
delay_ms(2000);
LCD1602_clear();
while(1)
{
          WDR ();
         if(flag_timer0_1s==1)
         {
             flag_timer0_1s=0;
                 AD_conversion();
                 Process_U0();
                 Process_U1();
         }
         
         if(Reset_Read==0)       //按键复位为0V
         {
             coder_num=0;
         }
         
         LCD_Display();

         Data_to_ASCII(coder_num,data);
         LCD1602_sendstr(1,11,data,4);
         SPI_Max5484_Data(coder_num);
}
}
作者: 箫天    时间: 2013-3-3 15:23
必须加精,不加精不足以平民愤。
作者: 落笔一哥    时间: 2013-3-4 08:50
好东西呀
作者: holged    时间: 2013-3-4 13:14
学习了
作者: 木马    时间: 2013-3-4 14:28
很牛逼。。
作者: 腹黑男    时间: 2013-3-4 18:36
那用已有的电脑电源能改成这样的数控电源么?
作者: avr_freshman    时间: 2013-3-4 21:05
虽然现在还不是很懂,但是真心感觉太牛逼了,非常佩服楼主的动手能力,强人 && 强帖啊。
作者: 八斤    时间: 2013-3-12 09:17
任哥的LCD一如既往地用软排线连接啊
作者: cqmiao    时间: 2013-3-18 23:38
不错哦,很紧凑哦
作者: oneway    时间: 2013-3-26 09:15
还是很精致的哈
作者: SengChuary    时间: 2013-4-10 15:54
外壳做的很精致,顶贴
作者: quanpengfei    时间: 2013-5-30 15:45
很好,这个必须顶,学习了
作者: zheng156    时间: 2014-3-14 10:18
好东西,佩服楼主!




欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) Powered by Discuz! X2.5