佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 7868|回复: 55

LM35D接PIC16F877A (LCD ADC)

[复制链接]
发表于 11-12-2006 09:13 PM | 显示全部楼层 |阅读模式
请问大家哪里可以买到Ferrite Bead?
除了Farnell....

吉隆坡的Pasar Road买得到吗?

Ferrite Bead 大概是怎样的?

请大家指点指点。。。。

[ 本帖最后由 pic 于 26-3-2008 07:36 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 20-12-2006 11:46 AM | 显示全部楼层
到my.farnell.com,
ferrite bead 外表和 SMD Capacitor 差不多。
用ferrite bead做什么呢?
回复

使用道具 举报

发表于 20-12-2006 12:43 PM | 显示全部楼层
要过EMC??????
回复

使用道具 举报

 楼主| 发表于 21-12-2006 02:56 AM | 显示全部楼层
原帖由 thngkaih 于 20-12-2006 11:46 AM 发表
到my.farnell.com,
ferrite bead 外表和 SMD Capacitor 差不多。
用ferrite bead做什么呢?


用来filter digital noise....
我现在在做project...
我的digital thermometer的reading一直跳。。
所以我要用ferrite bead来filter digital noise....
唉。。。。

要更farnell订,很麻烦。。。又很远。。。
唉。。。
谢谢。。。

[ 本帖最后由 Right 于 21-12-2006 02:57 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 21-12-2006 02:58 AM | 显示全部楼层
原帖由 ychenfei 于 20-12-2006 12:43 PM 发表
要过EMC??????


没有啦。。。哈哈。。。
我要做project....
回复

使用道具 举报

发表于 21-12-2006 09:02 AM | 显示全部楼层
原帖由 Right 于 21-12-2006 02:56 AM 发表


用来filter digital noise....
我现在在做project...
我的digital thermometer的reading一直跳。。
所以我要用ferrite bead来filter digital noise....

首先,
1。有人告诉你要用ferrite bead来filter digital noise?
2。为什么你认为是digital noise ?如何确定或只是猜测?
3。你是用什么digital thermometer ?是IC?Thermocouple ?
4。你是怎样读取digital thermometer 的reading?ADC?1 wire digital?
5。你用什么电源?稳定吗?
6。如可以,请放电路。

其实,读数reading一直跳, 不一定是noise。。。放了ferrite bead也不一定会变好。。。
取样方式也有技巧,也有Software Filtering的方式。。。
要先了解以上的疑问了才有准确有效的回覆。

如你还是坚持要ferrite bead, 你可以在旧电脑的Motherboard,SoundCard, Modem 等找到。希望你知道ferrite bead是长什么样子。
回复

使用道具 举报

Follow Us
 楼主| 发表于 21-12-2006 11:38 AM | 显示全部楼层
原帖由 pic 于 21-12-2006 09:02 AM 发表

首先,
1。有人告诉你要用ferrite bead来filter digital noise?
2。为什么你认为是digital noise ?如何确定或只是猜测?
3。你是用什么digital thermometer ?是IC?Thermocouple ?
4。你是怎样读取dig ...


我是从这个网址找到的。。。。
http://www.kmitl.ac.th/~kswichit/thermo/digithermo.htm

所以我就放在breadboard试试看,但没有放ferrite bead...
可是reading一直跳,所以想放来testing一下。。。。

我知道ferrite bead是怎样的啦。。。我在www.farnell.com看过了。。。


1。我是看了以上的网址,所以想放下去试试。我第一次用ferrite bead咯。。。
2。如 1。
3。用IC的
4。从ADC
5。 用的是学校的power supply,+5V
6。 电路在这里http://www.kmitl.ac.th/~kswichit/thermo/digithermo.htm

pic,谢谢你的回复
回复

使用道具 举报

 楼主| 发表于 21-12-2006 11:43 AM | 显示全部楼层
pic大哥,原来你刚做版主。。。
恭喜
回复

使用道具 举报


ADVERTISEMENT

发表于 21-12-2006 11:47 PM | 显示全部楼层
我看不到网站的电路 (Broken Link), 所以不了解是怎样接的。
你是用89C4051,还有CA3162 来做A/D 吗?

Reading会跳, 你就要学会懂得如何Debug, 这是学生作Project时, 很重要的一环。
要懂得假设,要假设结果,刚开始,你的功力不够, 会有困难,但要有正确的学习态度。

1。不接LM35,看reading还会跳吗?
2。不接LM35,接一稳定电压如1.5V的电池,看reading还会跳吗?
3。使用电池供电 (9V + 78L05),看有改善吗?
4。用Voltmeter 量A/D的input, 看是否稳定?
5。等等。。。
要找出主因(Root cause),才能对症下药,加ferrite bead, 不一定可以。
回复

使用道具 举报

 楼主| 发表于 22-12-2006 03:07 AM | 显示全部楼层
原帖由 pic 于 21-12-2006 11:47 PM 发表
我看不到网站的电路 (Broken Link), 所以不了解是怎样接的。
你是用89C4051,还有CA3162 来做A/D 吗?

Reading会跳, 你就要学会懂得如何Debug, 这是学生作Project时, 很重要的一环。
要懂得假设,要 ...


嗨, 谢谢,你的忠告
对,我是用AT89C4051,CA3162用来做A/D converter。。。

其实,你的建议1,2和4,我都试过了,除了建议3。。。
而且,我还用Voltmeter量A/D converter的Input,一边看voltmeter的reading,一边观察LCD上的显示。。。
Voltmeter的reading稳定,但LCD上的temperature reading却一直跳

1。当我除去LM35,把A/D的Input接去ground,reading还是跳。
       然后我把A/D的Input放空,没有reading。

2。我试过接0.4和0.5V,reading还是跳。

3。还没试。准备试。

4。voltmeter的reading稳定。

我还在想其他的可能性。。。

一下是电路的Link:
http://www.kmitl.ac.th/~kswichit/thermo/thermo.gif

[ 本帖最后由 Right 于 22-12-2006 03:23 AM 编辑 ]
回复

使用道具 举报

发表于 22-12-2006 11:35 AM | 显示全部楼层
Reading 跳, 是怎样的跳法?
可能和CA3162有关。
我要先看看CA3162的datasheet再说。


http://www.kmitl.ac.th/~kswichit/thermo/thermo.gif
Broken Link, 看不到。(如你能看到可能是你的PC已经Cache这张图了)

[ 本帖最后由 pic 于 22-12-2006 11:38 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 22-12-2006 11:52 AM | 显示全部楼层

回复 #11 pic 的帖子

首先,我们可以用50K和10K potentiometer来adjust那个CA3162的Zero和Gain。。。
调来调去,我能把在LCD上的reading调到大约二十多度,因为那时的室内温度大约是26度。但是,那个reading一直在20-30度的范围跳来跳去,fluctuate的非常快,它的reading一直在换。

昨天,我用Oscilloscope检查过了,我发现A/D converter的MSB signal有spike. 今天,我试看用100Ohms resistor来接MSB到AT89C4051 pin 4的路线。

试试这个Link:
http://lyeflyer.spaces.live.com/photos/?_c02_owner=1

[ 本帖最后由 Right 于 22-12-2006 12:15 PM 编辑 ]
回复

使用道具 举报

发表于 22-12-2006 12:33 PM | 显示全部楼层
看了CA3162的DataSheet,其实它不适宜连接(interface)到MCU。
要读取CA3162的ADC ,你要“捕捉”Digit driver pin 5,3,4, 还有BCD Output的pin 16,15,1,2。
而Digit driver 的timing是快速的一直在变,如你不明白程序和CA3162的原理的话,你是很难作的。

你了解CA3162的操作方式吗?如不明白你可能不知道我上面要说的是什么。

如还是不行,建议你改用PIC16F877A,相似的电路和范例可以在这里找到,#12楼
http://chinese.cari.com.my/myforum/viewthread.php?tid=708158&extra=page%3D1

你只需要稍稍修改程序,把LM35的ADC value换去Temp degC 就可以了,当然,我会教你。
回复

使用道具 举报

 楼主| 发表于 23-12-2006 01:38 PM | 显示全部楼层
原帖由 pic 于 22-12-2006 12:33 PM 发表
看了CA3162的DataSheet,其实它不适宜连接(interface)到MCU。
要读取CA3162的ADC ,你要“捕捉”Digit driver pin 5,3,4, 还有BCD Output的pin 16,15,1,2。
而Digit driver 的timing是快速的一直在变, ...


真的还是不行。。。
我听从你的教导。。。
回复

使用道具 举报

 楼主| 发表于 28-12-2006 04:09 PM | 显示全部楼层
原帖由 pic 于 22-12-2006 12:33 PM 发表
看了CA3162的DataSheet,其实它不适宜连接(interface)到MCU。
要读取CA3162的ADC ,你要“捕捉”Digit driver pin 5,3,4, 还有BCD Output的pin 16,15,1,2。
而Digit driver 的timing是快速的一直在变, ...


我使用了您介绍的PIC16F877A接LM35D...我改了一些您给的program...如下:

#include <16F877A.h>
#device ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////
// LCD Driver
///////////////////////////////////////////////////////////////////////////////
// As defined in the following structure the pin connection is as follows:
/*
LCD 16 X 2 line
PortD.0-> RS
PortD.1-> RW
PortD.2-> E
PortD.3
PortD.4-> D4
PortD.5-> D5
PortD.6-> D6
PortD.7-> D7
*/
/////////////////////////////////////////////////////////////////
// LCD Driver
struct lcd_pin_map {                 // This structure is overlayed
           boolean rs;               // on to an I/O port to gain
           boolean rw;               // access to the LCD pins.
           boolean enable;           // The bits are allocated from
           boolean unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;
#byte lcd = 0x08                 // on to port D (at address 0x08)
byte CONST LCD_INIT_STRING[4] = {0x28, 0xc, 1, 6};

void lcd_send_nibble( byte n )
{
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}

void lcd_send_byte( byte address, byte n )
{
      lcd.rs = 0;
      delay_ms(5);
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}

void lcd_init()
{
    byte i;
    set_tris_d(0);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
    {
      lcd_send_byte(0,LCD_INIT_STRING);
    }
}

void lcd_gotoxy( byte x, byte y)
{
   byte address;
   if(y!=1)
     address=0x40;
   else
     address=0;
   address+=x-1;
   lcd_send_byte(0,0x80|address);
}
void lcd_putc( char c)
{
   switch (c) {
     case '\f'   : lcd_send_byte(0,1); //delay_ms(5);
                    break;
     case '\n'   : lcd_gotoxy(1,2);          break;
     default     : lcd_send_byte(1,c);       break;
   }
}
///////////////////////////////////////////////////////////////////////////////

void main()
{
   long value;
   lcd_init();
   delay_ms(6);
   lcd_putc("\fTemperature");
   lcd_putc("\nReading");
   delay_ms(1000);
   setup_port_a( ALL_ANALOG );
   setup_adc( ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );
   while(TRUE)
   {
      value = Read_ADC();
      printf(lcd_putc,"\fReading: %lu ",value);
      delay_ms(500);
   }
}

可是,今天我试了之后,LCD完全没反应,没错的话,PIC16F877A是用XT oscillator如果我们用20MHz Crystal.它的pin11,12,31,32的Vss和Vdd都接了。。

那会是什么问题呢??
回复

使用道具 举报

发表于 28-12-2006 08:36 PM | 显示全部楼层
1。用20Mhz 的crystal,你要用HS。4Mhz才是用XT。

2。要Debug看你的MCU有没有运行,可以做最简单的闪灯, 接LED在PortB.0, 通过100~330ohm 电阻。
void main()
{
   while(TRUE)
   {
        output_high(pin_b0);
        delay_ms(500);
        output_low(pin_b0);
        delay_ms(500);
   }
}

一步一步来。。。可以了在试LCD的code。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 28-12-2006 08:46 PM | 显示全部楼层
原帖由 pic 于 28-12-2006 08:36 PM 发表
1。用20Mhz 的crystal,你要用HS。4Mhz才是用XT。

2。要Debug看你的MCU有没有运行,可以做最简单的闪灯, 接LED在PortB.0, 通过100~330ohm 电阻。
void main()
{
   while(TRUE)
   {
        output_h ...


谢谢,我明天再试。。。。
这真是很好的经验。。。
回复

使用道具 举报

 楼主| 发表于 29-12-2006 10:43 PM | 显示全部楼层
谢谢,PIC大大。
PIC16F877A已能运作了。。。

因为我在冷气房,所以温度大约二十多。。。但LCD的reading大约是54度,所以是多了三十。。。

我试了把%lu再剪掉30。。。然后compile,结果pass。。。
明天我再去用来program PIC16F877A...看结果如何。。。

。。。。。
while(TRUE)
   {
      value = Read_ADC();
      printf(lcd_putc,"\fReading: %lu-30 ",value);
      delay_ms(500);
   }
回复

使用道具 举报

发表于 30-12-2006 12:06 PM | 显示全部楼层

回复 #18 Right 的帖子

我试了把%lu再剪掉30。。。然后compile,结果pass。。。

错了 , 不是这样搞的。。。
当setup_port_a( ALL_ANALOG );, 那 ADC 的参考电压(Reference Voltage)是5V。(有需要我在说清楚)

#device ADC=10 是说用10bit ADC, 也就是 0-1023 step。
那么
如25degC, 那LM35的输出是 25x 10mV=250mV=0.25V

5V = ADC 1024
0.25V= (0.25x1024)/ 5=  ADC 51

当你得到ADC 54, 就是说  (54x 5V)/1024= 0.2636V,
换去DegC,0.2636V X 10mV/degC =26.36degC。

从上面, 我们求得一个factor:
(5/1024) / 0.01 = 0.48828

那么:54 x 0.48828 =26.367 degC
很简单吧。。。

调整:(Calibration)
用电表量你的5V, 如不是5V, 假设是4.95V,
那factor= (4.95/1024) / 0.01 = 0.48339


  1. void main()
  2. {
  3.    long value;
  4.    float temp;
  5.    lcd_init();
  6.    delay_ms(6);
  7.    lcd_putc("\fTemperature");
  8.    lcd_putc("\nReading");
  9.    delay_ms(1000);
  10.    setup_port_a( ALL_ANALOG );
  11.    setup_adc( ADC_CLOCK_INTERNAL );
  12.    set_adc_channel( 0 );
  13.    while(TRUE)
  14.    {
  15.       value = Read_ADC();
  16.       temp= value*0.48828;
  17.       printf(lcd_putc,"\nDegC  : %2.1f      ",temp);
  18.       delay_ms(500);
  19.    }
  20. }
复制代码
回复

使用道具 举报

发表于 3-1-2007 09:42 PM | 显示全部楼层

想问问。。。

原帖由 pic 于 30-12-2006 12:06 PM 发表

printf(lcd_putc,"\nDegC  : %2.1f      ",temp);


不好意思,想问问pic 大大,%2.1f 表示什么?? value output 了会有两个位数和一个小数点??
例如:26.5 degree ???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 23-12-2024 06:46 PM , Processed in 1.201320 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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