-------------------------**************************--------------------------------
一些相关内容请看
示波器V2.0调试过程贴
https://bbs.eeworld.com.cn/thread-154006-1-1.html
示波器V2.0装配调试(flt9006)VOL.1----修整板子
https://bbs.eeworld.com.cn/thread-154174-1-1.html
示波器V2.0装配调试(flt9006)VOL.2---- HSMC板装配完成
https://bbs.eeworld.com.cn/thread-154173-1-2.html
-------------------------**************************----------------------------
好久没有上贴汇报进度了,一个原因是工作比较多,另一个原因是出了不少小问题搞得很烦,还有就是缺了一些元件又不想专门跑市中心去买(虽然也就一个小时车,但天气太热)…就拖到现在了
说说现在的情况:
在HSMC板完成后,我开始焊模拟板.计划是这样,先弄电源,控制和一个模拟通道,并用单片机就小系统写一个测试程序,然后拿到公司去调试(我这里没有仪器).然后是写程序并调程序用了一周左右的时间(我做程序不是很在行哈),把驱动,界面什么的都做好调好了.然后装配模拟板的时候,出现了不少问题.
说说装配调试模拟板时发现的问题:
1,继电器的封装,我之前买的是Omron的G6K-2F-Y-5V,封装也是按那个做的,后来写清单时图方便,写G6K-2F-5V,结果买回来发现封装有小小差别,查了才发现是有-Y的是支持2500V隔离的,封装也有少少差别,虽然在当前使用也没有问题
2,BNC头的引脚孔做小了,不知道当时是怎么搞的,两种头的都做小了,要自己加工一下板子才能装上去
3,在打样前给地平面加了很多过孔,当时没有注意丝印的位置,盖住了不少,实际上元件布得也太密了
4,-5V电压用MC34063产生,当时没有计算好电流和效率,结果可能是因为压差太大,效率也不高,MC34063发热很大,烧了一片.停了很久才出去买了一片回来,然后将供电改为5V,在输出加上扩流管(2D882),现在测试勉强可以用,不过效率也就30%左右,人扩流管负荷还是比较大.
5,LT1085-5的散热没做好,在7V压差下,发热也比较厉害,虽说其自身挻得住,但对旁边的元件可能会有影响,特别是时钟,使用时最好把+12V电源改用6~8V的电源
6,芯片电源用33ohm的电阻连到系统电源的作法,实测发现在有的片子上压降达到近1V,太大了.同时分析会加大从芯片电源端看的电源内阻,虽然有106和104电容对交流短路,但电阻引入的直流电阻是不可忽略的.考虑换4.7ohm或2.2ohm.为什么不用电感观或磁珠?主要因为不知道用什么型号的好.而且之听说磁珠是"陷波器",又一直没有设备条件实测一下其特性,刚看了一下一些磁珠的手册,发现还是可以用的,三种东西的大概特性如下
图1,电阻/电感/磁珠的阻抗特性
图2,调试测试系统
图中的红圈一个是MC34063改5V供电,一个是加扩流管
没安装的元件是采样ADC,采样时钟和模拟通道2的相关元件
[ 本帖最后由 FLT9006 于 2010-9-3 23:21 编辑 ]下附程序
已经测试PWM/DAC/RELAY都可以正常受控了,看这周末把PWM转直流和DAC电压调理在家里调试好,再设计一个模拟通道的调试流程,就可以拿去找设备(信号源,示波器,频谱仪)调试了.
/*******************************************
*文件名称:eewolrd diy DSO ver2 analog_board dome
*文件功能:调试模拟板,包括模拟通道增益,切换继电器和产生PWM
*编 译 器:AVR-GCC(WINAVR)
*对应硬件:AVR MEGA16系统板,包括1602液晶和键盘
*原 作 者:flt9006
*完成时间:2010.08.15 18:04:15
********************************************/
/****************宏定义/全局变量*****************/
#include"includes.h" //(包括所需的底层/接口/模块的驱动和数据类型定义)
#define _K0_ 14 //键盘返回键值标定
#define _K1_ 5
#define _K2_ 6
#define _K3_ 7
#define _K4_ 9
#define _K5_ 10
#define _K6_ 11
#define _K7_ 1
#define _K8_ 2
#define _K9_ 3
#define _Kbck_ 13 //退出
#define _Kent_ 15 //确定
#define _Kup_ 4 //上
#define _Kdwn_ 12 //下
#define _Klft_ 8 //左
#define _Krgh_ 16 //右
#define _SELECT_5638_ PORTB&=0xef //片选选中
#define _FREE_5638_ PORTB|=0x10 //释放
#define _CH1_5638_ 0xc0 //写入通道1
#define _CH2_5638_ 0x40 //写入通道2
#define _REF_5638_ 0xd0 //改变基准
uint8 RLY_PRAM[5]={0}; //布尔量,继电器开关
uint8 PWM_PRAM[2]={127,127}; //PWM占空比
uint8 DAC_PRAM[2]={127,127}; //DAC值,输出时*16达到12位
/****************DAC底层函数*****************/
void TLV5638_refset(uint8 thedata) //0,Extern;1,1.024;2,2.048
{
_SELECT_5638_;
spiTransferByte(_REF_5638_);
spiTransferByte(thedata);
_FREE_5638_;
_delay_us(10);
}
void TLV5638_out(uint8 chA,uint8 chB) //两个通道同时发送
{ //方便调试只用高8位数据!!
_SELECT_5638_;
spiTransferByte((chA>>4)|_CH1_5638_);
spiTransferByte((chA<<4)| 0x08); //最低4位设为一半(8)的值
_FREE_5638_;
_delay_us(10);
_SELECT_5638_;
spiTransferByte((chB>>4)|_CH2_5638_);
spiTransferByte((chB<<4)| 0x08);
_FREE_5638_;
_delay_us(10);
}
/****************PWM/RELAY设置*****************/
void PWM_set(void) //设置PWM,占空比0~255,通道0/1
{ //设置PWM参数
OCR1A = PWM_PRAM[0]; //OC1A,PD5
OCR1B = PWM_PRAM[1]; //OC1B,PD4
}
/****/
void RLY_set(void) //继电器设置
{
//继电器设置
// PB0,1,2,3,6
uint8 tmp;
uint8 RLY_byte = 0;
if(RLY_PRAM[4])
RLY_byte |= 0x01;
RLY_byte <<=2;
for(tmp=4;tmp;)
{
RLY_byte <<=1;
RLY_byte |= (RLY_PRAM[--tmp]==1);
}
PORTB = RLY_byte; //SPI会对使用的脚重初始化,所以这里可以直接对整个口操作
}
/*********菜单和功能函数(对应1602LCD)********
uint16 mul_10(uint16 thedata)//乘以10,16位整数乘法以函数形式减少资源占用
{
return thedata*10;
}
/***********/
uint16 KEY_int(uint16 thelmt,uint16 thedf)
{ //从4X4键盘获得一个整数,范围0~thelmt,初值(默认)thedf \for 1602LCD
uint16 key_now,tmp;
uint16 thedata;
LCD_setadd(1,0);LCD_printSTR(PSTR("Setup: "));
thedata = thedf;
tmp = 0;
while(1)
{
LCD_setadd(1,6);
LCD_printSTR(PSTR(" "));
LCD_setadd(1,6);
LCD_printI(thedata);
tmp = thedata; //记录上次数值,返回默认值用
key_now = KEY_wait(); //获得一个键值
if(key_now==_Kbck_)
{
if(tmp==0)
return thedf; //退到0时返回默认值
else
thedata /=10;
}
else if(key_now==_Kent_)
return thedata;
else
{
switch(key_now)
{
case _K1_ :thedata=mul_10(thedata)+1;break;
case _K2_ :thedata=mul_10(thedata)+2;break;
case _K3_ :thedata=mul_10(thedata)+3;break;
case _K4_ :thedata=mul_10(thedata)+4;break;
case _K5_ :thedata=mul_10(thedata)+5;break;
case _K6_ :thedata=mul_10(thedata)+6;break;
case _K7_ :thedata=mul_10(thedata)+7;break;
case _K8_ :thedata=mul_10(thedata)+8;break;
case _K9_ :thedata=mul_10(thedata)+9;break;
case _Kup_ :thedata +=1 ;break;
case _Kdwn_ :thedata -=1 ;break;
case _Klft_ :thedata +=10;break;
case _Krgh_ :thedata -=10;break;
default :break;
}
if(thedata>thelmt)
thedata = thelmt; //范围限定
}
}
}
/***********/
void menu(void) //主菜单/主程序循环
{
uint8 tmp,key_tmp; //临时变量
while(1) //菜单内死循环
{
/*******以下部份是菜单获得输出参数*******/
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("Pres 2DACa 3DACb")); //提示选择波形
LCD_setadd(1,0);LCD_printSTR(PSTR("4RLY 5PWMa 6PWMb"));
key_tmp = KEY_wait();
if(key_tmp == _K2_) //DAC通道1
{
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("DACa Range:0~255")); //提示输入值
DAC_PRAM[0] = KEY_int(255,127) ; //获得值(0~255)
}
else if(key_tmp == _K3_) //DAC通道2
{
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("DACb Range:0~255")); //提示输入值
DAC_PRAM[1] = KEY_int(255,127) ; //获得值(0~255)
}
else if(key_tmp == _K4_) //继电器
{
//RELAY
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("RELAY:*****")); //提示输入值
LCD_setadd(1,0);LCD_printSTR(PSTR("input:(" />" />" />" /> 0/1)")); //提示输入值
for(tmp=0;tmp<5;tmp++)
{
RLY_PRAM[tmp] = 0; //默认为0
do
{
key_tmp = KEY_wait();
}while((key_tmp!=_K0_)&&(key_tmp!=_K1_) \
&&(key_tmp!=_Kent_)&&(key_tmp!=_Kbck_));
if(key_tmp==_K1_) //1
{
RLY_PRAM[tmp] = 1;
LCD_setadd(0,6+tmp);LCD_printSTR(PSTR("1"));
}
else if(key_tmp==_K0_)//0
{
LCD_setadd(0,6+tmp);LCD_printSTR(PSTR("0"));
}
else
break;
}
}
else if(key_tmp == _K5_) //PWM通道1
{
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("PWMa Range:0~255")); //提示输入值
PWM_PRAM[0] = KEY_int(255,127) ; //获得值(0~255)
}
else if(key_tmp == _K6_) //PWM通道2
{
LCD_clr();
LCD_setadd(0,0);LCD_printSTR(PSTR("PWMB Range:0~255")); //提示输入值
PWM_PRAM[1] = KEY_int(255,127) ; //获得值(0~255)
}
/*******以下为工作状态的屏幕信息********/
LCD_clr();
LCD_setadd(0,0);
LCD_printSTR(PSTR("DACa"));
LCD_printI(DAC_PRAM[0]);
LCD_printSTR(PSTR(" DACb"));
LCD_printI(DAC_PRAM[1]);
LCD_setadd(1,0);LCD_printSTR(PSTR("R")); //Sign RLY
for(tmp=0;tmp<5;tmp++)
{
if(RLY_PRAM[tmp])
LCD_printSTR(PSTR("1"));
else
LCD_printSTR(PSTR("0"));
}
LCD_printSTR(PSTR("Pa"));
LCD_printI(PWM_PRAM[0]);
LCD_printSTR(PSTR("Pb"));
LCD_printI(PWM_PRAM[1]);
/*******开始工作********/
RLY_set();
OCR1A = PWM_PRAM[0];
OCR1B = PWM_PRAM[1];
TLV5638_out(DAC_PRAM[0],DAC_PRAM[1]);
key_tmp = KEY_wait(); //等待任意键继续
}
}
/************主函数************/
int main(void)
{
uint8 tmp;
spiInit(2,1); //极性1,相位0,时钟8分频
DDRB |= 0x5f; //继电器和片选为输出
PORTB = 0x10; //片选关,继电器关
DDRD |= 0X30; //PD4,PD5(PWMa/b) output
OCR1A = PWM_PRAM[0];
OCR1B = PWM_PRAM[1];
TCCR1A = 0XA1; //8位快速PWM(CLK/256),
TCCR1B = 0X09; //不分频 ,设占比(0X0A为空比)
TLV5638_refset(1); //片内1.024V基准
TLV5638_out(DAC_PRAM[0],DAC_PRAM[1]); //初值为满幅50%
RLY_set(); //初值为全关
LCD_init(); //LCD初始化
//enter to menu
menu();
return 0;
}
/*********************文件结束**************************/
这是顶层文件,完整工程我就先不发了,到最后完成整理时再发)