一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: sln.1550
收起左侧

[avr] 小改M8数控电源

  [复制链接]
发表于 2016-9-9 13:26 | 显示全部楼层
谢谢楼主分享!!!
发表于 2016-9-11 20:20 | 显示全部楼层
希望吧示波器分享下,找不到哪个帖子
发表于 2016-11-3 18:32 | 显示全部楼层
lz能把跟随那部分的最终电路和代码放出来么?G大的模拟跟随受模块限制有些大。
 楼主| 发表于 2016-11-3 20:01 | 显示全部楼层
banguangan 发表于 2016-11-3 18:32
lz能把跟随那部分的最终电路和代码放出来么?G大的模拟跟随受模块限制有些大。

跟随的部分在顶楼说了,我改装的时候直接用同步整流模块上改焊的,没有抄电原理图。理论上可以用任何一个DC-DC的模块,方法是拆掉DC输出的电压反馈取样,上臂接固定电阻(我用的是15K),下臂接单片机和CD4066模块构成的电阻网络(按二次幂递减)。单片机根据M8V7的实际输出电压,调整电阻网络值,使跟随电压比输出高几伏。
代码其实很简单,既然有人有兴趣,我就贴一下。我比较懒,没有做成自动校正的,而是把电阻的实际测试值写进了代码:
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
?Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : M8V7 follow
Version :
Date    : 2015/1/16
Author  : sln.1550@163.com
Company : Anonymous
Comments: 需要判断输入电压比当前输出电压高后才能转换,而不是只判断输入电压。


Chip type               : ATtiny13A
AVR Core Clock frequency: 4.800000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*****************************************************/
// 定义输出控制bit位在PORTB的所在IO
#define OUT3 2
#define OUT2 1
#define OUT1 0
#define OUT0 4

// 38V 理想最大电压
#define R0  268  //unit: 100ohm  38×5/0.75
#define R1  10
#define R2  20
#define R3  39
#define R4  82  
#define R5  82
#define RS  0   // cd4066 导通电阻
#define IntVref 7 //unit: 0.1V    这是DC模块adj的比较器电压,7×0.1=0.7V,TP40057用

const unsigned int V1=IntVref*R0/(R1+RS);
const unsigned int V2=IntVref*R0/(R2+RS);
const unsigned int V3=IntVref*R0/(R3+RS);
const unsigned int V4=IntVref*R0/(R4+RS);
const unsigned int V5=IntVref*(R0+R5+RS)/(R5+RS);

#include <tiny13a.h>
#include <delay.h>
#include <iobits.h>
#define ADC_VREF_TYPE 0x43  // internal ref & ADC3 input         

unsigned int adc_value;
unsigned char adc_count,adc_flag;
unsigned int adc_sum=0;

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{

// Read the AD conversion result
    adc_sum+=ADCW;  
    if(++adc_count>=50)
    {
        adc_count=0;
        adc_value=adc_sum/50;
        adc_sum=0;
        adc_flag=1;   
    }
}

void output(unsigned char j)
{
    unsigned char buf=PORTB;
    if((j&0x8)>0)
        buf|=(1<<OUT3);
    else
        buf&=~(1<<OUT3);
    if((j&0x4)>0)
        buf|=(1<<OUT2);
    else
        buf&=~(1<<OUT2);
    if((j&0x2)>0)
        buf|=(1<<OUT1);
    else
        buf&=~(1<<OUT1);
    if((j&0x1)>0)
        buf|=(1<<OUT0);
    else
        buf&=~(1<<OUT0);  
    PORTB=buf;
}

unsigned int precal(unsigned char j)
{
    unsigned int i;
    i=V5;
    if((j&0x8)>0)
        i+=V1;
    if((j&0x4)>0)
        i+=V2;
    if((j&0x2)>0)
        i+=V3;
    if((j&0x1)>0)
        i+=V4;
    return i;
}

void main(void)
{
// Declare your local variables here
    unsigned char j;
    unsigned short i,voltage,k=0;
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x02;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=Out Func3=In Func2=Out Func1=Out Func0=Out
// State5=T State4=1 State3=T State2=1 State1=1 State0=1
PORTB=0x00;
DDRB=0x17;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
DIDR0=0x00;

// ADC initialization
// ADC Clock frequency: 37.500 kHz
// ADC Bandgap Voltage Reference: On
// ADC Auto Trigger Source: Free Running
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0&=0x03;
DIDR0|=0x00;
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0xAF;
ADCSRB&=0xF8;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/1024k
// Watchdog Timer interrupt: Off
#pragma optsize-
WDTCR=0x39;
WDTCR=0x29;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

adc_flag=0;
// Global enable interrupts
#asm("sei")
SETBIT(ADCSRA,ADSC);
j=0;
    while (1)
    {
        if(adc_flag>0)
        {         
            adc_flag=0;                    
            #asm("WDR");
            voltage=(adc_value*11/20*93/2/51)+28;   // unit: 0.1V 这部分是根据ADC取样的分压电阻来计算的,28表示2.8V,就是跟随压差
            adc_value=0;
            i=precal(j);  
            if(voltage>i)
            {
                if(j<15)
                    j++;
                k=0;
                output(j);
            }
            else
            {
                if(++k>125)
                {
                    if(j>0&&voltage<=precal(j-1))
                        j--;
                    k=0;
                    output(j);
                }
            }
            if(voltage+50<i)
            {
                if(j>0)
                    j--;
                k=0;  
                output(j);
            }
        }   
    }
}


发表于 2016-11-4 09:20 | 显示全部楼层
本帖最后由 钟义亭 于 2016-11-4 10:19 编辑

voltage=(adc_value*11/20*93/2/51)+28;  
// unit:  0.1V 这部分 是根据ADC取样的 分压电阻 来计算的

根據 自己設值 , 來改程式
有源碼   好處多
電子負載 -  可調電源
拆銲台 -  恆溫銲槍
都是 兄弟 ,  可互改

http://www.avrvi.sdu.edu.cn/info/1076/1232.htm

基于 RC充放电的 电阻与电容 测量

This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator


http://www.amobbs.com/forum.php?mod=viewthread&action=printable&tid=4997390










评分

参与人数 1一乐金币 -30 收起 理由
美人鱼999 -30

查看全部评分

发表于 2016-11-6 19:05 | 显示全部楼层
sln.1550 发表于 2016-11-3 20:01
跟随的部分在顶楼说了,我改装的时候直接用同步整流模块上改焊的,没有抄电原理图。理论上可以用任何一个 ...

非常感谢lz的无私奉献,备件中,准备试试hrd12008,我有好几块.
 楼主| 发表于 2016-11-7 09:11 | 显示全部楼层
banguangan 发表于 2016-11-6 19:05
非常感谢lz的无私奉献,备件中,准备试试hrd12008,我有好几块.

嗯,这个模块也不错。做的时候注意下M8V7的主控电源一定不要比输入电源早断电,否则输出就会有高压直通的问题,我之前没注意,烧了好几个单片机

发表于 2016-11-17 19:58 | 显示全部楼层
数控电源迷.
发表于 2017-5-22 17:43 | 显示全部楼层
找到了这个帖子, 刚刚把我的电源从V4升到V7,
现在喜欢 软关机。
请问我的是2004的液晶能直接不改电路用你的固件吗,我也不喜欢总按下去。另外温度对我不重要。
 楼主| 发表于 2017-5-22 20:09 | 显示全部楼层
buch1234 发表于 2017-5-22 17:43
找到了这个帖子, 刚刚把我的电源从V4升到V7,
现在喜欢 软关机。
请问我的是2004的液晶能直接不改电路用 ...

可以的,不看温度显示也没问题

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-20 01:41 , Processed in 0.052960 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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