[秀作品] 示波器V2.0装配调试(flt9006)VOL.3----测试程序

FLT9006   2010-9-3 23:08 楼主

-------------------------**************************--------------------------------

一些相关内容请看

示波器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.为什么不用电感观或磁珠?主要因为不知道用什么型号的好.而且之听说磁珠是"陷波器",又一直没有设备条件实测一下其特性,刚看了一下一些磁珠的手册,发现还是可以用的,三种东西的大概特性如下
  image10.jpg
图1,电阻/电感/磁珠的阻抗特性

 

image11.jpg


图2,调试测试系统
 

image12.jpg
图3,模拟板现在的样子

 

图中的红圈一个是MC34063改5V供电,一个是加扩流管

没安装的元件是采样ADC,采样时钟和模拟通道2的相关元件

[ 本帖最后由 FLT9006 于 2010-9-3 23:21 编辑 ]

回复评论 (5)

下附程序
已经测试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;   //范围限定
    }         
  }
}
/***********/

[ 本帖最后由 FLT9006 于 2010-9-3 23:23 编辑 ]
点赞  2010-9-3 23:12

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;
}

/*********************文件结束**************************/

这是顶层文件,完整工程我就先不发了,到最后完成整理时再发)

点赞  2010-9-3 23:13
再次对楼主表示感谢,辛苦了。万里长征已经走完了一半的路程了。坚持下去胜利一定属于我们!
点赞  2010-9-10 08:34
支持下,期待早日完工
点赞  2010-9-28 13:45

回复 板凳 FLT9006 的帖子

楼主辛苦了哈哈哈,好东西顶顶顶顶顶顶
点赞  2011-1-22 17:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复