查看: 7868|回复: 55
|
LM35D接PIC16F877A (LCD ADC)
[复制链接]
|
|
请问大家哪里可以买到Ferrite Bead?
除了Farnell....
吉隆坡的Pasar Road买得到吗?
Ferrite Bead 大概是怎样的?
请大家指点指点。。。。
[ 本帖最后由 pic 于 26-3-2008 07:36 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 20-12-2006 11:46 AM
|
显示全部楼层
到my.farnell.com,
ferrite bead 外表和 SMD Capacitor 差不多。
用ferrite bead做什么呢? |
|
|
|
|
|
|
|
发表于 20-12-2006 12:43 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 21-12-2006 11:38 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 21-12-2006 11:43 AM
|
显示全部楼层
pic大哥,原来你刚做版主。。。
恭喜 |
|
|
|
|
|
|
|
发表于 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。 |
|
|
|
|
|
|
|
楼主 |
发表于 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
- void main()
- {
- long value;
- float temp;
- 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();
- temp= value*0.48828;
- printf(lcd_putc,"\nDegC : %2.1f ",temp);
- delay_ms(500);
- }
- }
复制代码 |
|
|
|
|
|
|
|
发表于 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 ??? |
|
|
|
|
|
|
| |
本周最热论坛帖子
|