2

关于投票
M16做的简易示波器,有一定的实用性,低成本适合初学者

      

  觉得好请顶一下

     原帖有部分代码和电路图片,有需要的可以去看哈。主要是不好整理,所以没有贴过来。http://www.ouravr.com/bbs/bbs_content_all.jsp?bbs_sn=702504

   

 

  功能介绍: ADC采样频率100K, 可以采样10K-20K的信号, 100us - 1s 扫描时间选择, 0.5v - 10v 的电压选择;信号触发控制:信号触发沿选择, 信号触发类型选择(自动,标准,单次),信号触发电压调整。 硬件: CPU - M16, LCD - TG12864

用手机拍的,效果不怎么好
点击看大图
点击看大图 

http://www.ouravr.com/bbs/bbs_content_all.jsp?bbs_sn=702504

系统分类: 测试测量
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(168) | 回复(5)

1

关于投票
LCD图形显示_菜单管理_PCF8583_TWI_SPI所有C代码公开
现将2006在一家公司做的一个产品的仿真部分所有源码资料公布,供大家学习和参考!包括参菜单管理算法。菜单翻页可像手机菜单一下,可滚动翻页,并有进度条指示。另还有TWI读写PCF8563的程序。不多说大家看看就知道。以前只公布过protues和hex,反映还可以。今天是源码也公布,希望对大家有帮助。传播请注明作者及出处,谢谢!

图示效果一
点击看大图
 (原文件名:效果_1.png) 

图示效果二
点击看大图
 (原文件名:效果_2.png) 

使用手册截图
点击看大图
 (原文件名:手册.PNG) 

点击看大图
 (原文件名:2.PNG) 


所有资料打包
点击此处下载 ourdev_274225.rar(文件大小:1.05M) (原文件名:debug.rar) 

资料包文件目录
E:\debug>tree /f
卷 WORK 的文件夹 PATH 列表
卷序列号码为 000007BC E4BD:002B
E:.
│  效果_1.png
│  效果_2.png
│  效果_1.jpg
│  效果_2.jpg
│  使用手册V1_0.pdf

├─source
│      Main.h
│      Display.c
│      DotLib.c
│      SPI.h
│      SPI.c
│      Display.h
│      Dotlib.h
│      TWI.h
│      PCF8563.c
│      PCF8563.h
│      TWI.c
│      Includes.h
│      Main.c

└─protues
        LCDBoard.DSN
        Debug.cof
        Debug.hex
        LCDBoard.PWI

程序中的菜单架构提取出来,让大家查看更直观。

/* 菜单架构 */
typedef struct
{
        INT8U KeyTab_MenuIndex;                                                         // 当前状态索引号
        INT8U KeyTab_MaxItems;                                                               // 本级菜单最大条目数
    INT8U KeyTab_PressOk;                                                                // 按下"回车"键时转向的状态索引号
    INT8U KeyTab_PressEsc;                                                               // 按下"返回"键时转向的状态索引号
    INT8U KeyTab_PressDown;                                                              // 按下"向下"键时转向的状态索引号
    INT8U KeyTab_PressUp;                                                            // 按下"向上"键时转向的状态索引号
    void (*CurrentOperate)( void );                                                    // 当前状态应该执行的功能操作
}KeyTabStruct;
void ( *KeyFuncPtr )( void );                                                          // 按键功能指针
/*--------------------------------显示菜单(字库)----------------------------*/
INT8U *TestFace[3]={
        "测试中",                                                                                                                                
        "当前端口",                
        "接触电流"        
};
INT8U *Power[3]={
        "设定电压",                                                                                                                                
        "当前电压",                                                                                                                                
        "工作电流"                                                                                                                                
};
INT8U *MenuRoot[5]={                                                                                                                                
           "一设备类型",                                                                                                                                
        "二端口设定",                                                                                                                                
        "三参数设置",                                                                                                                                
        "四系统设定",                                                                                                                                
        "五关闭系统"                                                                                                                                
};
INT8U MenuRootID[5]={EUTtype,PortSet,Paramete,SystemSet,ShutOff};
INT8U *MenuEutTpye[4] ={
        "壹类",                                                                                                                                         
        "贰类",                                                                   
        "接地",                                                                                                                                         
        "不接地"                                                                                                                                         
};
INT8U MenuPortID[9] ={Port0,Port1,Port2,Port3,Port4,Port5,Port6,Port7,Port8};
INT8U *MenuParam[4] ={
        "电源电压",                                                                                                                                
        "测试时间",                                                                                                                                
        "间隔时间",
        "外部采样"
};
INT8U MenuParamID[4] ={Voltage,Testtime,Spacetime,Exterior};
INT8U *MenuSystem[3] ={
        "时间设定",                                                                                                                                 
        "背光设定",                                                                                                                                
        "键音设定"                                                                                                                                
};
INT8U MenuSystemID[3] ={Time,Backlight,Buzzer};
INT8U *MenuBackLight[2] ={
        "绿光",                                                                                                                                                                                         
        "红光"                                                                                                                                        
};
INT8U MenuBackLightID[2] ={Green,Red};
INT8U *Adjust[1]={
        "校正因子"
};
INT8U*Msg[7] = {
        "启动中…",                                                                                                                                        
        "关机中…",                                                                                                                                
        "已保存!",
        "电源电压不稳",                                                                                                                                        
        "请稍等!",
        "合格",        
        "不合格!"                
};
/*-----------------------------------按键架构---------------------------------*/ 
/*CurMenuID           = 本菜单ID
  MaxMenuItem         = 同级菜单最大项数
  OkMenuID                  = 子菜单层所对应的菜单ID,ID=255为菜单已经到底了
  EscMenuID           = 父菜单层所对应的菜单ID,ID=255为菜单已经到顶了
  DownMenuID          = 弟菜单层所对应的菜单ID,ID=255为菜单是独生子
  UpMenuID            = 兄菜单层所对应的菜单ID,ID=255为菜单是独生子
  CurFunction         = 本菜单所对应的菜单函数指针                                  */                                                  
KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={
/* CurID   Max  Ok          Esc         Down        Up         CurFunction    */  
{FACE,      0,        Menu,       Menu,            255,            255,          *FunctionNul     },
{Menu,                5,        EUTtype,    FACE,            PortSet,        ShutOff,  *FunctionNul     },
{EUTtype,        2,        I_type,         Menu,            PortSet,        ShutOff,  *FunctionNul     },
{I_type,        0,        255,                 EUTtype,        II_type,        II_type,  *Function_I            },
{II_type,        0,        255,                EUTtype,        I_type,     I_type,   *Function_II           },
{PortSet,        9,        Port0,             Menu,            Paramete,   EUTtype,  *FunctionNul     },
{Port0,            0,        255,                 PortSet,        Port1,            Port8,           *Function_Port   },
{Port1,            0,        255,                 PortSet,        Port2,            Port0,           *Function_Port   },
{Port2,            0,        255,                 PortSet,        Port3,            Port1,           *Function_Port   },
{Port3,            0,        255,                 PortSet,        Port4,            Port2,           *Function_Port   },
{Port4,         0,        255,                 PortSet,        Port5,            Port3,           *Function_Port   },
{Port5,            0,        255,                 PortSet,        Port6,            Port4,           *Function_Port   },
{Port6,            0,        255,                 PortSet,        Port7,            Port5,           *Function_Port   },
{Port7,            0,        255,                 PortSet,        Port8,            Port6,           *Function_Port   },
{Port8,         0,        255,                 PortSet,        Port0,            Port7,           *Function_Port   },
{Paramete,        3,        Voltage,        Menu,                SystemSet,        PortSet,  *FunctionNul     },
{Voltage,        0,        255,             Paramete,        Testtime,   Exterior, *Function_Paramet},
{Testtime,        0,        255,             Paramete,        Spacetime,  Voltage,  *Function_Paramet},
{Spacetime,        0,        255,             Paramete,        Exterior,   Testtime, *Function_Paramet},
{Exterior,        0,        255,             Paramete,        Voltage,    Spacetime,*Function_Paramet},
{SystemSet,        3,        Time,            Menu,                ShutOff,    Paramete, *Function_System },
{Time,            7,        Year,            SystemSet,        Backlight,        Buzzer,   *FunctionNul     },
{Year,            0,        255,            Time,            Month,            Second,   *Function_Time   },
{Month,            0,        255,            Time,            Day,            Year,     *Function_Time   },
{Day,            0,        255,            Time,            Week,            Month,    *Function_Time   },
{Week,            0,        255,            Time,            Hour,            Day,      *Function_Time   },
{Hour,            0,        255,            Time,            Minute,            Week,     *Function_Time   },
{Minute,        0,        255,            Time,            Second,            Hour,     *Function_Time   },
{Second,    0,        255,            Time,            Year,            Minute,   *Function_Time   },
{Backlight,        2,        Green,                 SystemSet,        Buzzer,            Time,           *FunctionNul     },
{Green,            0,        255,        Backlight,  Red,        Red,          *Function_BkLight},
{Red,           0,        255,            Backlight,        Green,            Green,    *Function_BkLight},
{Buzzer,        2,        Open,                 SystemSet,        Time,            Backlight,*FunctionNul     },
{Open,            0,        255,             Buzzer,     Close,      Close,          *Function_Open   },
{Close,            0,        255,            Buzzer,         Open,            Open,     *Function_Close  },
{ShutOff,        0,        255,            Menu,            EUTtype,        SystemSet,*Function_ShutOff} 

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=1054447&bbs_page_no=1&bbs_id=9999

系统分类: 单片机
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(335) | 回复(0)

1

关于投票
发布我的小作品--U盘(实际是USB SD卡读卡器) ATmega168+PDIUSBD12+SD
这是最新的代码,原贴在46楼    -- 20071223 bozai加入
点击此处下载armok01148323.zip


发布我的小作品--U盘(实际是SD卡读卡器) ATmega168+PDIUSBD12+SD (内含GCC源码和原理图)



年前里曾在44b0x板子上实现移动硬盘的功能,年后利用在阿莫这买的一片TQFP封装的m168 和一年前在上海赛格买的D12,再加上花15大洋的SD读卡器上的SD插槽。终于把这个东西做出来了。



这里把它公布出来,有兴趣的朋友可以仿制,修改,大家共同探讨。



也许选SD卡作为存储设备加上没有选择带总线的AVR单片机是个错误,这个小东西的速度,读只有370KB/s 写只有198KB/s 。为了提高sd卡的操作速度,晶振选用20Mhz。

AVR芯片用m8 和m88都可。



程序标准请求部分是参照原来那块ARM板子上的例子,MassStorage那部分自己花了很久才搞出来,由于没用中断,所以有点乱。大家凑或着看吧。



整个东西实用性不大,不过可以做为学习USB使用。板子是在万用板上焊的,有兴趣的朋友可以做PCB。









这是全部资料的压缩包

另外程序是在AvrStudio4.13b528 + WinAVR20070122下编译的

点击此处下载armok01146099.zip



这是板子的正面图

点击看大图



这是板子的反面图

点击看大图



放在盒子里

点击看大图



插在CH375做的mp3上可以正常播放

点击看大图





插在电脑上

点击看大图



可以显示自定义的信息

点击看大图


20080129:(上传一些清晰的照片):
1点击看大图

2点击看大图

3点击看大图

4点击看大图

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=725761&bbs_page_no=1&search_mode=3&search_text=bozai&bbs_id=9999
系统分类: 单片机
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(78) | 回复(3)

1

关于投票
MP3制做成功,仿手机操作菜单,附源代码
放假前买了zl0801的一块MP3板,于是利用假期把原来的程序更新了一下,有很多地方都是参考Bozai和zl0801的程序。现公布源码,有此板的朋友们可以参考一下。
  主要加入的功能就是菜单显示,是看到手机上的显示方式来的灵感。本人比较喜欢玩吉他,于是加入了几个平时玩吉他要用的小工具。

  目前只实现了,音乐播放,吉他调音器,音乐文件浏览等功能,其它的功能正在开发中,只支持FAT32文件格式。现有的程序中还有很多bug,放歌时有时会死机(不过现在很少出现了),显示汉字时有些字显示不完全,可能是字库文件跨簇引起的。
    在这里要感谢Bozai和zl0801,若不是他们的程序,我不可能在这么短时间内弄懂FAT。
   源代码:
点击此处下载ourdev_223655.rar(文件大小:921K)




原理图和PCB:
点击此处下载ourdev_224515.rar(文件大小:228K)
在这也可以下到,这是zl0801的贴 http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=855912&bbs_page_no=1&bbs_id=1000
另附液晶取模软件:(今天网速太慢了,传了半天也传不上去,下次再补上)

本菜单的实现占了很多RAM,因为我在RAM里建了一个菜单结构数组,大家从代码里可以看到。原先是打算在ROM里做一个双向的环形链表,后来发现实现不了,请看如下代码
struct OPTION {
        unsigned char index;
        PGM_P string;    //选项名字
        PGM_VOID_P nomIco;    //没有选中时的图标
        PGM_VOID_P sltIco;    //选中时的图标
        struct OPTION *lastOpt;  //上一个选项
        struct OPTION *nextOpt;   //下一个选项
};
typedef struct OPTION OPTION;
//这是声明的第一个选项,
OPTION optPlay PROGMEM ={
   1,
   ("播放音乐"),  //可能不能这样写,但编译可以通过
   ico1,
   ico2,
   optSetup,  //设置  //在这里就出现了问题,因为optSetup在前面没有声明,但不能把optSetup放在前面声明,原因请看下面
   optTone,  //调音   //optTone也没有声明
};
//这是声明的最后一个选项,
OPTION optSetup PROGMEM ={
   8,
   ("系统设置"),  
   ico3,
   ico4,
   optFileView,  //上一个选项,在前面已声明
   optPlay,  //下一个选项,将回到第一个选项,播放音乐的选项,前面已声明,如果把optSetup放在optPlay的前面声明,那这里又
};            //会出现没有声明

我想过,其实用汇编很好实现,指向结构的指针无非就是存放另一个结构在ROM中的起始地址,完全可以在ROM中做这样一个环形链表,但
用汇编写菜单的话工量太大了。
本人学AVR的时间不是很长,对GCC中PGM_P,和PGM_VOID_P的区别不是很懂,希望哪位朋友能指点一下

贴几张图片
  
1点击看大图

2点击看大图

3点击看大图

4点击看大图

5点击看大图


   http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=931228&bbs_page_no=1&search_mode=1&search_text=mp3&bbs_id=9999
系统分类: 模拟技术
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(85) | 回复(1)

0

关于投票
模拟滤波器设计流程——(三)从系统指标到电路映射

片上集成的模拟滤波器常常是系统中的一个组成模块,对滤波器所有的性能指标要求来源与于系统指标的分解。比如说滤波器的噪声,线性度,带外抑制度,带内纹波,时延特性等等。确定采用何种类型,多少阶次的滤波器都可以通过系统仿真得到。举个例子说,7阶的butterworth5阶的切比雪夫在带外抑制度上可能都差不多,但在带内纹波和时延特性上却不尽相同,这样的两个滤波器分别代入系统做系统仿真,很容易就可以看到他们各自的特性对解调误码率的影响。而如果都满足系统要求的情况下,如何去选择合适的滤波器,还要综合考虑复杂度,以及成本。

事实上做系统仿真的时候,往往就将我们能选择的滤波器类型范围缩小了。而再考虑一下实现成本,基本上能够达到指标要求的滤波器类型和阶次也就定了。剩下的工作无非就是常规的滤波器设计。利用普遍的滤波器设计工具,代入抑制度,截止频率,增益等参数,就能得到特定结构中使用到的元件参数。在综合滤波器设计的时候,最为广泛运用的应该是级联方式。通过将高阶次的传递函数分解为多个一阶和二阶传递函数的组合,再分级实现滤波器。这种方法大大简化了滤波器的设计,避免了多级反馈,从电路设计难度上来讲要更为容易一点。

假设我们需要设计一个5阶的butterworth型低通滤波器。首先将滤波器划分为3级结构,1级一阶,22阶。再根据归一化的传递函数表和滤波器的截止频率,可以得到各级的特征频率和Q值。知道了这两个值之后带入对应的1阶或2阶传递函数,可以很方便地求解出需要的RC(也有可能是GmC)值。这样我们就将滤波器与普通的模拟电路如如运放等关联起来。

滤波器设计从这个层次再往下,考验的就是我们对基本的模拟电路模块如运算放大器,Gm单元等电路的掌握能力了。

如果滤波器传递分解之后有多级2阶结构,则需要考虑不同Q值的2阶结构在链路中的位置。Q值高的一般放在后面,因为高Q值放在前面影响滤波器的动态范围。但放在后面对抑制滤波器内部噪声却没什么好处,因为落在高Q值模块谐振峰值处的噪声会被放大。

http://www.eefocus.com/bbs/article_5399.html

系统分类: 模拟技术
用户分类:
标签: 无标签
来源: 转贴
发表评论 阅读全文(46) | 回复(0)

0

关于投票
Xilinx与Altera FPGA比较系列之三 时序分析(1)
FPGA时序分析实用指南

1.       基本时序分析

a)         时钟周期

时钟周期分析是最简单的一个, 也是最容易理解的一个分析, 硬件对应的基本道理是寄存器输出延迟 + 逻辑操作延时 + 连线延迟 + 建立时间 必须小于时钟周期, 上面的式子即定义了最短的时钟周期, 也即信号的最高工作频率. 在一些实际情况下, 上面的式子会有一些变化, 比如考虑时钟的抖动, 不同信号状态下传输的延迟不一样, . 一般情况下, 分析最坏情况即可. 一般情况下, 时钟周期都是作为全局约束添加的. FPGA工作当中, 只需要加一个简单的时钟周期约束即可. 在实际项目当中, 可能会遇到有多个相关时钟, Quartus II, 可以设置时钟之间的相对关系, 然后只需要设置基本的时钟约束即可. 可以在 Assignments à Settings à Timing Analysis Settings à Classical timing analyzer à Individual clock中设置. Quartus比较熟悉的也可以通过.qsf文件设置, 具体语法可以参考原有的设置, 一般情况下, 只要稍作修改就可以了. 直接编辑.qsf文件的好处是对于添加多个类似的约束比较快. ISE, 可以使用 User constraints à create timing constraints, 通过图形界面设置, 也可以直接编辑.ucf文件实现. 同样, 具体语法可以参考现成的文件.

b)         输入setup

输入数据的setup要求是初学者经常搞糊涂的一个约束. 其实QuartusISE里边对输入setup的定义都非常清晰, 也即, 从外部来看, 只要满足时钟和数据一定的关系, FPGA内部可以保证不会出现亚稳态现象(即采在数据的沿上). 下面这幅图给出了Tsu的定义.

 

 

Quartus, 这个参数是Tsu, 其准确定义如下: The length of time for which data that feeds a register via its data or enable input(s) must be present at an input pin before the clock signal that clocks the register is asserted at the clock pin. 具体计算公式如下: tSU = <pin to register delay> + <micro setup delay> - <clock to destination register delay>. 确切的说, 这个定义应该是从外部看到的FPGA的时序要求. 比如Tsu 0.5ns, 那么只要数据在0.5ns之前建立, 数据送入FPGA应该不会出现问题. Tsu可以是全局约束, 也可以是局部约束. 全局约束可以通过Assignments à Settings à Timing Analysis Settings à Classical timing analyzer中的Tsu来设置, 局部约束可以通过Assignment Editor来添加.

 

ISE, 叫做Offset In Before或者Pad to setup, 准确定义如下: The minimum time for input signals to be stable before they can be sampled correctly on the next active clock edge. 具体计算公式为: Slack = Requirement - (Data Path - Clock Path + uncertainty)

举个例子来说, 如果时序报告给出数值为4.468ns, 那么这意味着数据必须在时钟沿之前4.468ns建立, 换而言之, 只要外部送入数据在4.468ns之前建立, FPGA内部采用不会出问题. 具体的计算方法如同Altera. Offset in Before可以是全局约束, 也可以局部约束, Constraint Editor可以设置.

 

在实际使用过程中, 通常大部分情况下, 数据和时钟都是每个周期有效. 因此, 数据到底在哪个时钟周期被寄存器捕获其实并不重要, 关键是所有的相关数据(比如一个总线的数据[7:0])必须保证在一个时钟周期内采样. 因此, 如何避开会造成亚稳态以及如何使得相关的数据的Tsu尽量保持一致, 是解决数据输入FPGA的时序问题的关键. 比如, 假定输入FPGA的数据在时钟沿的1ns处发生变化, 那么Tsu应当避开这个1ns附近这个区域. 只要按照上述原则操作, 时序裕量都会是够的. 在一些特殊情况下, 比如有使能信号传递, 或者是数据的时钟周期必须严格对其, 或者是时钟抖动特别大, 则需要更加仔细的考虑时序约束.

c)         Tco

TcoClock to output的延时. 道理如同Tsu, 只不过是换个角度看问题, 即作为驱动源来看待的问题. 也是从外部观察的. 下面这幅图给出了Tco的定义

 

 

Quartus, 这个参数是Tco, 其准确定义如下: The maximum time required to obtain a valid output at an output pin that is fed by a register after a clock signal transition on an input pin that clocks the register. 意思是相对于输入时钟管脚而言, 从寄存器输出的数据(到达pin)最长多长时间可以稳定. 具体的计算公式如下:

tCO = <clock to source register delay> + <micro clock to output delay> + <register to pin delay>. Tco可以是局部约束