搜索
bottom↓
楼主: hzn1948

AVR综合应用实例:[原创] 基于Atmega88的 迷你多功能仪表

[复制链接]

出0入0汤圆

发表于 2010-10-21 11:03:18 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-10-21 11:06:39 | 显示全部楼层
MARK

出0入0汤圆

 楼主| 发表于 2010-10-22 08:27:20 | 显示全部楼层
测电感,测频率的操作与测电容相似,都是单次测量模式

输出方波和正弦波信号时,+/-键用于改变频率,当前频率显示在显示屏上
                        频率的改变无法做到无级变化,只能是数字化跳变
               正弦波信号输出的幅值随频率变化也会改变,频率越高,幅值越低

电压电阻的测量在一个功能模块,由exec键随机切换,均为连续测量显示模式

校准功能中依次校温度,电容零点,电感零点
        校准温度时,是一个连续测量显示的温度计,+/-键可以加大或减小测值,完成以后exec键确认并转入下一项
                                                                         或mod键放弃修改转入下一项
       电容零点,电感零点校准时exec键确认并转入下一项,或mod键放弃修改转入下一项

出0入0汤圆

 楼主| 发表于 2010-10-22 10:05:34 | 显示全部楼层
程序在AVRSTUDIO的纯汇编环境下编译
FLASH占用6686,(81.6%),其中code5356,data1330
m88中未用的端口还有:PD0/PD1/PD2/PC2

         程序结构描述

一,定义与说明
      程序简要说明
      可变常数赋值
      自定义宏
      定义寄存器变量及位变量
      定义I/O端口
      定义RAM变量和数据缓冲区
      定义EEPROM变量

二,初始化程序
      中断向量表
      复位初始化
        设置堆栈指针
        设置看门狗
        配置i/o端口
        外围器件初始化
        初始化数据
      显示开机画面

三,循环执行程序段

四,基本系统程序
      LCD1602相关程序
        初始化LCD1602
        写特殊字符到LCD
        全屏刷新
          写一个字符到LCD
            写命令
            写数据
        从FLASH读显示字符串到显示缓冲区
        修改显示缓冲区
        特殊字符数据表

      DS1302相关程序
        初始化
          1302写使能
          禁写1302
          启动1302
        读1302到RAM
        写RAM到1302
          单字节读1302
          单字节写1302
          脉冲

      键盘扫描程序

      任务调度程序

      通用子程序
        20ms延时
        0---5ms延时
        精确长延时
        EEPROM写
        EEPROM读

      中断程序
        T2溢出
        T1溢出
        T1捕捉
        T0溢出
        ADC转换结束

      数学_运算子程序
        2字节数平方
        2字节乘1字节
        2字节乘2字节
        0.***系数计算
        5字节/4字节====3字节 专用除法
        4字节/2字节====2字节 除法
        4字节/2字节====2字节+2字节小数 除法
        定点整数二翻十
        定点小数二翻十

五,功能模块程序
     待续

出0入0汤圆

发表于 2010-10-22 10:13:08 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2010-10-24 07:57:03 | 显示全部楼层
自己先顶一下

出0入0汤圆

发表于 2010-10-24 10:48:30 | 显示全部楼层
严重顶一下

出0入0汤圆

 楼主| 发表于 2010-10-24 14:18:25 | 显示全部楼层
且不管是否有人感兴趣,继续

//************0号功能模块:日历时钟与温度计相关程序**************************

//********0号功能模块主程序********************************

CLOCK_TEMP:
      *     
      *              相关设置
      *
clock_loop:      ;循环程序开始

   rcall TEMP_UPDATE      测温

   cli
   rcall READ_1302_TO_RAM 读时钟

   rcall DISP_TIME        显示

      *

   sec_delay:            一次检测完成后等待1秒,期间扫描键盘以便决定程序走向
   wdr
   rcall ADC_KEY_SCAN     键盘扫描
   sbrc  KEY_BIT,key_mod
   ret        ;-----------循环程序出口
   sbrc  KEY_BIT,key_exec
   rcall SETTING_time
   sbrc  KEY_BIT,key_plus
   rcall INC_MIN
   sbrc  KEY_BIT,key_minu
   rcall DEC_MIN
   sbrs  FLAG,second_call  
   rjmp  sec_delay
   rjmp  clock_loop        ;循环程序终点

      *
      *
t_r_table:
.dw 65535,65535,65535,65535,65535,64271,60922,57771,54806,52014    测温用的数据表
.dw 49383,46904,44567,42363,40283,38319,36465,34713,33057,31491
      *
      *
//********0号功能模块主程序***********END


//********0号功能模块子程序*********

//**********显示***************
DISP_TIME:
      *
      *
      *
      *
    ret


//***********测温*************
TEMP_UPDATE:
      *
      *
      *
      *
    ret


//*************温度计/校准**********************
TEMP_CARLIBRATION:
      *
      *
      *
      *
    ret

     ;温度校准程序专用子程序----显示温度
     DISP_TEMP:
      *
      *
      ret

     ;温度校准程序专用子程序----保存校准参数
     CHANGE_temp_factor:
      *
      *
      ret

     ;温度校准程序专用子程序----修改参数使温度测量值增加
     INC_temp:
      *
      *
      ret

     ;温度校准程序专用子程序----修改参数使温度测量值减少
     DEC_temp:
      *
      *
      ret


//**************时钟日历设置*******************
SETTING_time:
      *
      *
      *
      *
    ret

     *子程序
      INC_MIN:
      DNC_MIN:
      CLR_SEC:

//************0号功能模块:日历时钟与温度计相关程序****END

出110入12汤圆

发表于 2010-10-24 15:10:44 | 显示全部楼层
支持,我想做一个

出0入0汤圆

发表于 2010-10-24 16:54:55 | 显示全部楼层
用汇编的来顶!!

出0入0汤圆

 楼主| 发表于 2010-10-25 08:55:47 | 显示全部楼层
为避免“空谈”,下面先详细介绍频率计程序
本制作的频率计未加预处理电路,而且还借用测电感输入电路,所以不能测高频率
但是测量处理程序自己认为是合理的,有特色的

//F_METER相关程序***********************
string_F_METER:
.db "   Fx=          "         ;频率计显示画面数据
.db "        .   Hz  "

F_METER:                       ;测量主程序
   ldiw  z,(2*string_F_METER)  ;切换到频率计显示
   rcall string_to_code_buff   ;读显示数据
   rcall LCD_write_new         ;更新显示


  ;init_t1:                    ;设置定时器T1
   clr   temp               
   sts   TCCR1A,temp
   sts   TCCR1B,temp
   lds   temp,TIMSK1
   ori   temp,1<<TOIE1;|1<<ICIE1
   sts   TIMSK1,temp

  test_t_0:
   wdr
   sbic  PIND,5         ;定位低电平
   rjmp  test_t_0

   clr   temp           ;T1准备
   sts   TCNT1H,temp
   sts   TCNT1L,temp
   clr   byte_3

   cli

  test_t_1:             ;先用周期法测
   sbis  PIND,5         ;捕获高跳变
   rjmp  test_t_1


   ldi   temp,1<<CS10    ;启动T1
   sts   TCCR1B,temp

  test_t_2:
   sbic  PIND,5          ;捕获低跳变
   rjmp  test_t_2


   lds   xl,TCNT1L        ;保存半周期值 (3byte)
   lds   xh,TCNT1H
   sts   T_hh,byte_3
   sts   T_h,xh
   sts   T_l,xl

   clr   byte_3           ;T1复位
   clr   temp
   sts   TCCR1B,temp
   sts   TCNT1H,temp
   sts   TCNT1L,temp

   ldi   temp,1<<CS12|1<<CS11   ;设定T1计数,external falling edge
   sts   TCCR1B,temp            ;测频率

   ldi   temp3,5
   del_1s:                 ;1 second delay
   ldi   temp,200
   rcall DELAY_NmS         ;200ms*5=1000ms
   dec   temp3
   brne  del_1s

   cli                      ;读取数据
   lds   r3,TCNT1L          ;频率值整数在r1r2r3
   lds   r2,TCNT1H
   mov   r1,byte_3

   clr   r0                  ;继续用周期法测部分周期
   sts   TCNT1H,r0
   sts   TCNT1L,r0
   clr   byte_3
   ldi   temp,1<<CS10
   sts   TCCR1B,temp

   ;sei

   sbis  PIND,5              ;区别当前电平高低
   rjmp  test_t_4

  test_t_3:
   sbic  PIND,5
   rjmp  test_t_3

   lds   xl,TCNT1L           ;读取高电平延续时间
   lds   xh,TCNT1H
   lsr   byte_3              ;数据除以2
   ror   xh
   ror   xl

   lds   yl,T_l
   lds   yh,T_h
   lds   temp,T_hh

   sub   yl,xl
   sbc   yh,xh
   sbc   temp,byte_3

   rjmp  save_Td

  test_t_4:
   sbis  PIND,5
   rjmp  test_t_4

   lds   xl,TCNT1L              ;读取低电平延续时间
   lds   xh,TCNT1H

   lds   yl,T_l
   lds   yh,T_h
   lds   temp,T_hh

   sub   yl,xl
   sbc   yh,xh
   sbc   temp,byte_3
   lsr   temp
   ror   yh
   ror   yl

   save_Td:
   sts   Td_hh,temp      ;获得非整半周期数 Td_hh/Td_hh/Td_l
   sts   Td_h,yh   
   sts   Td_l,yl

   cli

   rcall CONV1            ;频率值整数在r1r2r3 转化为十进制

   rcall DISP_F_METER_HZ  ;显示频率值整数

   lds   r0,Td_hh         ;计算频率的小数部分
   lds   r1,Td_h
   lds   r2,Td_l
   clr   r3

   lds   r4,T_hh
   lds   r5,T_h
   lds   r6,T_l


   rcall DIV_X_Y_FACTOR   ;计算程序(x/y=0.***)

   mov   r2,r3            
   clr   r3

   rcall CONV3             ;转换为十进制

   rcall DISP_F_METER_HZ_D ;显示频率的小数部分

   rcall LCD_write_new     ;数据送LCD显示

   sei
   ret

//********************************


有必要介绍精确延时程序,这是测频率是否准确的关键

//**********NmS精确长延时************
//N由temp传递

DELAY_NmS:    ;N=temp=1~255
   in   _sreg,sreg
   cli
   ldi  temp2,1<<PSRASY      ;复位予分频
   sts  GTCCR,temp2
   clr  temp2
   sts  TCNT2,temp2          ;T2是1ms定时中断

   ldi  temp2,255
   sub  temp2,temp
   inc  temp2
   mov  clock1,temp2
   cbr  FLAG,1<<ms_call
   sei
   del_loop:
   wdr
   sbrs FLAG,ms_call
   rjmp del_loop
   out  sreg,_sreg
   ret

//****************************

T2定时中断里有:
  clock:                 ;内部时钟
   inc   clock1
   brne  out_tovf2
   ldi   clock1,6
   sbr   FLAG,1<<ms_call ;250ms标记
     *
     *
     *

出0入0汤圆

发表于 2010-10-25 10:12:29 | 显示全部楼层
同样是用汇编的来顶!!

出0入0汤圆

发表于 2010-11-5 10:43:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-8 23:17:51 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-11-9 12:19:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-29 12:19:08 | 显示全部楼层
非常好哦!

出0入0汤圆

发表于 2010-12-29 12:27:03 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2010-12-29 12:37:35 | 显示全部楼层
只会用汇编的顶.

出150入0汤圆

发表于 2010-12-29 13:18:33 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-12-29 14:11:27 | 显示全部楼层
很强大

出0入8汤圆

发表于 2010-12-29 14:16:26 | 显示全部楼层
lz可以开源全部资料吗

出0入0汤圆

 楼主| 发表于 2010-12-30 10:00:24 | 显示全部楼层
关于开源问题:全部是汇编,交流比较困难,程序比较复杂,我回答问题也会吃力
             打算逐步分模块介绍实现原理和编程思路,与大家一起探讨

上面的话是我在一楼表明的想法

原理图和HEX文件已经提供,HEX文件在145楼

非常希望有人先制作成功,用洞洞板搭接其实并不困难,零件数目应该算少的了
有人做成功了,就可以证明是否好做好用,精度如何,就会有更多的人愿意尝试甚至会设计制作PCB
人气高了我的积极性也高,欢迎大家提出问题,,结合具体问题讨论

讨论中凡是我贴出的程序段,都是从源程序中拷贝,是可以作为参考和用来移植的
直到有一天,将尽可能完美的源程序上传

出0入0汤圆

发表于 2010-12-30 14:56:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 15:05:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 15:23:13 | 显示全部楼层
mark  强人~

出0入0汤圆

发表于 2010-12-30 16:03:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-30 20:25:10 | 显示全部楼层
lz强人!

出0入0汤圆

发表于 2011-1-2 15:51:18 | 显示全部楼层
顶!!

出0入0汤圆

发表于 2011-1-2 20:44:04 | 显示全部楼层
关注中

出0入0汤圆

 楼主| 发表于 2011-1-3 10:17:13 | 显示全部楼层
回【180楼】 laoshiyuan:

先不要管487,而且程序中并无相关内容,出现在原理图中只是说明可以考虑以后扩展
A,B是485通信接线端子

如果你用DIP封装芯片,建议你不要连接下载接口那部分电路,该电路兼顾做LCD1602接口,我没验证过

可能由于LCD1602封装有问题(型号不同等原因)
请按以下说明检查:
PB6,PB7备用/PB0~PB3输出数据PB4---RS,PB5---EN

有什么问题只管提,肯定能成功的

出0入0汤圆

发表于 2011-1-7 17:50:36 | 显示全部楼层
快贴出全部代码,我们来做测试,

出0入0汤圆

 楼主| 发表于 2011-1-8 15:38:31 | 显示全部楼层
C9,我用普通CBB电容223J,不需要按仪器的要求选元件,等本制作成功以后用测量电容功能重新校准替换
原理图上标着:R6/(R6+R5)=0.3935  电阻实际阻值相差几倍也没关系,用电阻串并联凑,尽量接近0.3935
125K电阻影响测量电容的准确性
热敏电阻是NTC,阻值10K(25度时),还有一个参数是3800左右,反正是常用的普通产品,一定要是10K

出0入0汤圆

发表于 2011-1-11 14:17:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-11 19:48:06 | 显示全部楼层
好帖,mark

出0入0汤圆

 楼主| 发表于 2011-1-12 10:45:03 | 显示全部楼层
"那个20uH的电感没找到,买了个22uH的"  OK  也许应该标22uH的,差不多就可以,有零点校准
L2我用的是22欧姆电阻
D0是一般的二极管用作保护,"+12V"是网络号,输入电压可以是DC12V或DC9V,D0可不用

菜鸟有菜鸟的好,少有成见,不会嫌弃其他菜鸟,不怕失败.....

出0入0汤圆

发表于 2011-1-12 13:41:05 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-2-8 14:27:10 | 显示全部楼层
谢谢laoshiyuan的祝福!也祝福你新年快乐

祝所有论坛的新老朋友新年快乐,万事如意

"请问下那个PB0是复用的吗?"
-----是的.R16起隔离的作用,PB0作为数据信号线,只在更新数据时使用
                          用捕捉功能测温度也是间隙使用,所以可以复用.也是别无选择

出0入0汤圆

 楼主| 发表于 2011-2-9 09:15:04 | 显示全部楼层
请楼上不要再使用诸如"谨听LZ教诲"之类的
"原来隔离电阻这么用的啊……"听起来也是怪怪的,叽讽的语气
我说 某电阻起隔离的作用,你改成 该电阻是隔离电阻
...

出0入0汤圆

发表于 2011-2-10 12:02:09 | 显示全部楼层
如果有完整代码,注释,我会把它改成C代码,并做成proteus仿真,

出0入0汤圆

发表于 2011-2-10 12:10:07 | 显示全部楼层
太牛了。

出0入0汤圆

发表于 2011-2-10 14:15:46 | 显示全部楼层
回复【197楼】qq603727388
如果有完整代码,注释,我会把它改成c代码,并做成proteus仿真,
-----------------------------------------------------------------------

顶楼上,对此项目非常有兴趣,LZ能否开源全部汇编代码?关注中

出0入0汤圆

发表于 2011-2-15 09:32:36 | 显示全部楼层
对此项目非常有兴趣,LZ能否开源全部汇编代码?关注中

出0入0汤圆

发表于 2011-2-15 09:53:50 | 显示全部楼层
一直佩服用汇编的

出0入0汤圆

 楼主| 发表于 2011-3-5 08:31:58 | 显示全部楼层
一直以来对C编程若即若离,这次下了决心,终于有了进展,算是入了门
感谢197,199,200楼对本项目的关注,另外还有好多人都希望有C源程序

在这里我向大家报告一个好消息:大约三周以后开源全部我自己改写的C代码
LCD1602相关程序刚刚改写调试成功,其他应该也一定能成功
我用的是AVR studio 4 和AVR GCC

最近AVR比较冷,大家多来加一点热吧

出0入0汤圆

 楼主| 发表于 2011-3-7 09:57:08 | 显示全部楼层
自己顶一下
又调试成功了DS1302和ADC单线键盘
时钟只是基本操作部分,已经用了2788字节
估计全部写好后8K放不下

出0入0汤圆

发表于 2011-3-7 11:49:44 | 显示全部楼层
厉害,mark下

出0入0汤圆

 楼主| 发表于 2011-3-8 10:15:19 | 显示全部楼层
自己为自己加油!

调试数据运算时遇到困惑:两个整型数相乘,结果为长整型,模拟运行的结果 高16位都是0x0000,低16位正确
                        无法继续调试下去

有遇到过的朋友帮我指点一下吧

出0入0汤圆

 楼主| 发表于 2011-3-10 14:51:05 | 显示全部楼层
万事开头难
GCC中有二/十进制调整运算吗?

出0入0汤圆

 楼主| 发表于 2011-3-10 16:10:00 | 显示全部楼层
自己写了一段,最大99999999数字二/十进制转换,花费了270字节,运行速度:11000个机器周期
贴上来看看:
long CONV_TO_DECIM(long bi)
{
  uint8_t i;
  long decimal=0,binery=bi;

  for (i=0;i<8;i++)
    {
          decimal|=(binery%10<<(i*4));
          binery=binery/10;
        };
  return decimal;
}

出0入0汤圆

发表于 2011-3-10 16:11:04 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-3-13 10:03:24 | 显示全部楼层
自己为自己加油!

成功在望,测电容程序已经调试成功,原来所述零点附近数据跳变现象没有了

用掉程序空间5K多一点,如果到最后能再放得下测电感和测频率的程序就很满意了

出0入0汤圆

发表于 2011-3-14 00:14:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-14 01:05:25 | 显示全部楼层
这个要顶,可惜我的时间总是不够用啊。。。

出0入0汤圆

 楼主| 发表于 2011-3-14 13:54:30 | 显示全部楼层
c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: mini_meter.elf section .text will not fit in region text
c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: region text overflowed by 594 bytes

走过路过请帮助解释上面的编译出错提示的意义和解决办法

出0入0汤圆

发表于 2011-3-14 16:00:26 | 显示全部楼层
先顶一下下...

出0入0汤圆

发表于 2011-3-14 19:41:09 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-3-14 20:42:19 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-3-15 15:05:08 | 显示全部楼层
频率计已经调试好,效果比较满意,24KHz时与示波器误差3Hz,而且测量数值一致性很好,显示分辨率0.01Hz
测电感的依据是测频率,所以精度不成问题
但是我需要计算:
       电感(uH)=常数0x1ACEBDE0A0/(频率(Hz))平方
由于缺少相关经验,编程遇到困难,暂时无法实现
还望高手给予帮助

此事已经花费我大量时间,如果那位能提供上述计算公式实现的代码,万分感谢

出0入0汤圆

发表于 2011-3-15 16:01:04 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-3-16 09:10:27 | 显示全部楼层
灌水求助

我用的优化级别是-0s,已经成功编译的代码占用FLASH 5430bytes
再加入计算代码时编译能通过,但FLASH占用未改变,软件仿真时这些代码被跳过
????

出0入0汤圆

 楼主| 发表于 2011-3-17 11:05:10 | 显示全部楼层
灌水求助!!

出0入0汤圆

 楼主| 发表于 2011-3-18 16:39:42 | 显示全部楼层
第一次用GCC编程,很多问题不明白,一次又一次试,一次又一次失败
好比在迷宫中努力寻找出口----幸运的是总算找到了一个出口

计算电感的程序调试成功了

显示屏,键盘,加上 测电容,电感,频率,时钟,温度只用掉 6100 bytes 程序空间,比预计的要好

任务可以如期完成了,先好好休息一下

出0入0汤圆

发表于 2011-3-18 17:52:08 | 显示全部楼层
这个要mark

出0入0汤圆

发表于 2011-3-18 18:15:14 | 显示全部楼层
必须的

出0入0汤圆

发表于 2011-3-18 18:24:20 | 显示全部楼层
MARK是必须的

出0入0汤圆

 楼主| 发表于 2011-3-19 15:26:37 | 显示全部楼层
我在218楼说:我需要计算:
             电感(uH)=常数0x1ACEBDE0A0/(频率(Hz))平方

因为常数0x1ACEBDE0A0超过长整型的长度,编译器可能要调用更复杂的内部库函数而消耗大量内存所以出现如下错误

c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: mini_meter.elf section .text will not fit in region text
c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: region text overflowed by 594 bytes

改变方法以后用如下程序计算:
测得的频率(HZ)在f_return
对应的电容22000pF

  if (f_return>3400)
    {
      c=0x205C29A/f_return;
      c=c*c;
      c=CONV_TO_DECIM(c);
      c=c>>8;

      LCD_code_buff[12]=(c&0x0F)|0x30;//显示结果*****.*uH
      LCD_write_number(10,c>>4);
    }
        else if(f_return>520)
        {
      c=0x105F7E/f_return;
      c=c*c;
      c=CONV_TO_DECIM(c);
      c=c>>8;
      LCD_code_buff[12]=(c&0x0F)|0x30;//显示结果*****.*mH
      LCD_code_buff[13]='m';
      LCD_write_number(10,c>>4);
        }
        else
          {
            c=0x40000;
        LCD_code_buff[12]=(c&0x0F)|0x30;//显示结果: >4000.0mH
        LCD_code_buff[13]='m';
        LCD_code_buff[6]='>';
        LCD_write_number(10,c>>4);
          };

出0入0汤圆

 楼主| 发表于 2011-3-19 15:35:29 | 显示全部楼层
另外我在206楼遇到的问题:

“调试数据运算时遇到困惑:两个整型数相乘,结果为长整型,模拟运行的结果 高16位都是0x0000,低16位正确
                        无法继续调试下去 ”

现在解决了,将两个相乘的数都定义为长整型就可以

出0入0汤圆

 楼主| 发表于 2011-3-20 10:15:26 | 显示全部楼层
根据F,L,C之间的计算公式,当C=22000pF时有:
    L(uH)=1151377086845/(f*f)

为了提高计算精度,在长整型数据限制前提下将结果放大1000倍
      1000*L(uH)=1151377086845000/(f*f)
                =(1151377086845000开方/f)*(1151377086845000开方/f)
      1151377086845000开方=0x205C2AB  ----226楼由于计算误差为0x205C29A

      c=0x205C29A/f_return;
      c=c*c;

      将这样计算的结果先转换成十进制:  c=CONV_TO_DECIM(c);
      舍弃最后两位,得到以0.1uH为单位的结果:  c=c>>8;

出0入0汤圆

 楼主| 发表于 2011-3-20 10:31:58 | 显示全部楼层
if (f_return>3400)

为什么要分段处理?频率小于3400Hz时计算结果超过十进制8位数,而转换程序限制最大8位数字

出0入0汤圆

 楼主| 发表于 2011-3-21 16:27:36 | 显示全部楼层
终于完成了!
原来的功能中除开信号输出(正弦,脉冲)其他的都加了进去
FLASH占用 7272 bytes,88.8% Full
觉得数字比较巧,决定不再作任何修改了,瑕疵/BUG是难免的,留给他人去完善吧!

出0入0汤圆

发表于 2011-3-21 17:30:29 | 显示全部楼层
nice DIY.

出0入0汤圆

发表于 2011-3-21 21:09:52 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2011-4-28 17:54:54 | 显示全部楼层
最近又见坛友关心DIY测量仪的帖子,忍不住再来冒个泡
我不想食言关于共享源码的承喏,只是还在完善过程中
今天编写调试成功了可变频率/可变占空比的PWM波信号输出功能,频率范围1kHz----400kHz
效果比较满意,我想这个功能对开发电源产品比较实用
又想着要加上可变频率正弦波信号输出功能(最大4000HZ,汇编程序中已经实现),但是FLASH用完了
必须忍痛割爱删除日历时钟,要是有一片ATmega168多好啊

出0入0汤圆

发表于 2011-4-28 19:39:27 | 显示全部楼层
留名。

出0入0汤圆

发表于 2011-4-28 20:11:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-28 20:49:59 | 显示全部楼层
顶楼主!关注结果。

出0入0汤圆

发表于 2011-4-30 10:56:46 | 显示全部楼层
测试

出0入0汤圆

 楼主| 发表于 2011-4-30 11:25:12 | 显示全部楼层
请楼上不要气馁,制作过程一次成功几乎是没有的
我最近新做了一个,发现我提供的原理图上有一个数据有误,R2应为1K,而不是5K
制作过程中首先要实现的是LCD1602能够显示开机画面,这与其他可能存在的问题都无关联
(程序在开机时停留在开机画面等待键盘操作信号)

出0入0汤圆

发表于 2011-4-30 14:30:34 | 显示全部楼层
关注

出0入0汤圆

 楼主| 发表于 2011-5-10 17:58:20 | 显示全部楼层
CKDIV8 应改为 1

下载的资料中原理图能打开,PCB打开后看不到内容,不知何故,请查一下

出0入0汤圆

发表于 2011-5-10 19:47:50 | 显示全部楼层

出0入0汤圆

发表于 2011-5-10 20:03:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-10 20:18:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-10 20:59:56 | 显示全部楼层
继续顶,成功在望!!

出0入0汤圆

发表于 2011-5-10 21:12:50 | 显示全部楼层
PCB打开正常。两种布局。

出0入0汤圆

发表于 2011-5-10 21:43:32 | 显示全部楼层
AD9可以打开的。LS的板子画得漂亮哦

出0入0汤圆

 楼主| 发表于 2011-5-11 09:30:55 | 显示全部楼层
改了熔丝位之后,果然快多了----CKDIV8的作用是震荡频率除以8
                          ----现在用C编程的新程序,刷屏速度更明显加快

时间调整那些还没设置成功----先别管它,新的程序这部分做了较大改进,等着用新的程序

独立键盘肯定好,我会出这种版本,ADC键盘用在这里对编程是一种考验,多路ADC并行后台运行

125nf的电容没找到----用104加223,不够可以再加,总和稍大于125nf即可不需要准确,因为有校准程序

两个加减键,好像反了----是的,我新做一块实验板的时候注意到了

在缺少仪器校准的情况下,测量精度如何获得?

晶振的频率是可信的,用比较可信的万用表测量电阻值,采用串并结合获得尽可能准确的电阻值:125K,1K,
以及电阻比 R6/(R6+R5)=0.3935 在此基础上测量的电容值就是正确的,用自身的测电容功能校准选用电容22000pf电容
则电感测量值也会是准确的

记得好象零点校准程序没有最后完成,注意要烧写EEPROM 里面有零点修正数据
电容零点可以这样处理:改变C0(100PF)的值,使得不接电容时的测量结果为非零值,因为显示0其实不一定是0

说以上这些是为了方便laoshiyuan 早点成功,新版程序快完成了,到时候结合程序再作说明

出0入0汤圆

 楼主| 发表于 2011-5-12 09:19:17 | 显示全部楼层
”温度那个可以进去调整,但是最低温度38,39度,不知道是不是我买的热敏电阻有问题“

热敏电阻规格是10K,在25度时电阻为10K,测量一下就知道了,如果不对的话肯定不行
校准温度的方法是:将测量值乘上一个系数K(0<K<1)以后再查表,校准程序中改变K值,K增加显示温度降低,K最大为1,所以调整有限度,实际上K值很接近于1,亦即理论上不需要修正的,为了有修正的幅度,所以要求将125nF电容值取偏大一点,使测量结果偏大,然后再乘上K。。。。

电容零点校准程序确实未编写完
电感零点校准程序已经写好,但我没有印象是否肯定好,不过电感零点校准时应用短导线代替被测电感

程序初始设定值如下:

temp_factor_e:  .db 0xF0,0x00    ;温度计校准系数
l_0_e:          .db 0xEF         ;L0值  单位:0.1uH(23.9uH)
c_0_e:          .db 0x90         ;C0值  单位:Pf

出0入0汤圆

发表于 2011-5-14 10:12:47 | 显示全部楼层
关注这个贴子很久了,楼上的,你在241楼把楼主原有的ISP下载口去除了,我洗板之后才发现。我手头只有贴片的M88,附件是我在241楼的基础上,用贴片M88,加入ISP做的板子,改进的地方:
1.M88和LM393改成贴片的。
2.板子缩小成100x64,适合DIY底成本制作。
3.电池改成电脑主板的电池座。
改的不好的地方请大家提出来。

另外请楼主更新一份新的Hex或传源码上来,小弟等很久了,去年10月第一个hex放出来,到现在,很久没有更新Hex了。谢谢!!!


贴片M88,2D预览图 (原文件名:2D正面图.JPG)


底部预览图 (原文件名:2D底图.JPG)

M88_C_L仪表Protel99格式原理图和PCBourdev_639709DB2PNX.rar(文件大小:129K) (原文件名:贴片M88_C_L仪表.rar)

出0入0汤圆

 楼主| 发表于 2011-5-15 17:26:15 | 显示全部楼层
点击此处下载 ourdev_639987TT7TQ1.rar(文件大小:7K) (原文件名:new_f_l_c.rar)

以上是新编的程序,删去了时钟和温度计,增加了PWM波输出和正弦波输出
PWM波频率和占空比可调,在GND和PB2之间输出
正弦波输出在PB2 和另一输出端子之间输出,该输出端子通过33K电阻与PB1连接,PB1,PB2之间接100nf电容
正弦波输出的频率在10HZ到2000HZ之间调节,有正负极性,无直流分量
这样做缺点是增加了端子数目

出0入0汤圆

 楼主| 发表于 2011-5-15 18:01:32 | 显示全部楼层
源文件由多个文件组成,力求能够演示GCC下,头文件,汇编程序文件,C文件之间的关系
需要反复推敲完善,暂不上传

出0入0汤圆

发表于 2011-5-15 20:56:10 | 显示全部楼层
继续顶。!

出0入0汤圆

发表于 2011-5-15 21:09:09 | 显示全部楼层
关注

出0入0汤圆

 楼主| 发表于 2011-5-16 16:28:10 | 显示全部楼层
请 laoshiyuan 调试新程序时注意,键的位置被我改动过,试几次就知道了
编写单线键盘时才注意到
如果发现任何问题请提出来,我会做解释或修改程序后再上传
还有用加/减键修改正弦波频率后要按一次EXEC键才会有信号输出

出0入0汤圆

 楼主| 发表于 2011-5-17 08:06:12 | 显示全部楼层
测电压和测电阻在同一功能模块,新程序不需要手动切换,而是自动切换

出0入0汤圆

发表于 2011-5-17 08:18:26 | 显示全部楼层
请楼主制作一个技术文档,把原理及技术细节都说下,谢谢!

出0入0汤圆

发表于 2011-5-21 05:07:19 | 显示全部楼层
COOL

出0入0汤圆

 楼主| 发表于 2011-5-21 09:10:11 | 显示全部楼层
回复【269楼】laoshiyuan
-----------------------------------------------------------------------

邮件已发,请查收

出0入0汤圆

 楼主| 发表于 2011-5-21 09:48:26 | 显示全部楼层
回复【258楼】oem88
“ 另外请楼主更新一份新的Hex或传源码上来,小弟等很久了,去年10月第一个hex放出来,到现在,很久没有更新Hex了。谢谢!!!

其实 去年10月第一次上传的hex 后来没有改动过,与原理图也是完全吻合
我在259楼的程序,输出PWM和SINE信号部分需要硬件作改动,对已经制板的来说是有问题的

由于我的疏忽,到今天我才注意到你对本制作的如此重大贡献,让我们共同努力

出0入0汤圆

 楼主| 发表于 2011-5-21 16:05:50 | 显示全部楼层
谢谢LS的辛勤工作!

本帖从开帖以来时间不算短了,终于有了第一位制作成功者!感到非常高兴
我在前面的帖子里曾经说过,本制作只是一个学习AVR单片机的实例,与“仪器”的要求相差很远,如果作仪器使用的话,只能用于要求不高的场合,况且谁没有万用表呢,所以测电压,电阻完全不是为了使用而是为了学习和练习对单片机资源的综合应用

为了能够与大家交流,我新学习了GCC编程,但毕竟新手,所写程序难登大雅之堂,所以需要假以时日,待完善以后再上传交流
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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