PDA

View Full Version : Giúp em về vấn đề hiển thị trên lcd !!


meopic
03-01-2010, 11:00 AM
Tình hình là em đag làm đồ án về dụng cụ đo điện áp xài con pic16f88, áp được đưa vào adc và hiển thị lên LCD. Vấn đề em gặp phải là thông số điện áp trên LCD nháy quá nhiều, đôi lúc nhảy những giá trị o chính xác.
Đây là code chương trình của em :
[code]#include <16f88.h>
#include <def_88.h>
#device *=16 ADC=10
#fuses NOWDT, HS, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=8)
#include <LCD_4BIT16F88edit.C> // Thu vien ham cho LCD
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int16 temp;
int8 nghin,tram,chuc,donvi;
int1 mili_volt;
float volt;
void convert_bcd(int16 x)
{
nghin = x / 1000 +0x30;
temp = x % 1000;
tram = temp / 100 +0x30;
temp = temp % 100;
chuc = temp / 10 +0x30;
donvi = temp % 10 +0x30;
}
void main( )
{
set_TRIS_B(0x00);
LCD_init();
delay_ms(100);
LCD_Putcmd(0X80);
printf(LCD_putchar,"DIEN AP ");
setup_adc( ADC_CLOCK_INTERNAL );
Setup_ADC_ports (0);
Set_ADC_channel (0) ;
Delay_us (100);
while (1){
temp = read_adc() ;
volt=(float)(temp*5)/1023;
volt=volt*1000;
convert_bcd((int16)volt);
lcd_putcmd(0xc0);
{printf(lcd_putchar,"U= ");
lcd_putchar(nghin);
lcd_putchar(".");
}
lcd_putchar(tram);
lcd_putchar(chuc);
lcd_putchar(donvi);
printf(lcd_putchar," V");
printf("%u.%u%u%u",nghin-0x30,tram-0x30,chuc-0x30,donvi-0x30);
}
}[code]

Tuy nhiên, trước khi vào adc của pic thì em có dùng cái mạch phân áp như sau nữa, o bit có tạo nhiễu nhiều hay o ??!!
Các bác có cao kiến gì thì chỉ giáo dùm em với, e sắp bảo vệ rùi nên mong các bác hồi âm sớm
ah !! thầy em có bảo là dùng thuật toán cộng giá trị trung bình (gttb) j đó rùi hiển thị thì sẽ bớt nháy đi tuy nhiên e ko bit phải làm sao để lấy ra các lần xuất ra để tính gttb nữa !! mong các ace giúp đỡ !!
Thanks !!!

tungnh
03-01-2010, 08:16 PM
1. Kiểm tra hiển thị LCD có đúng không?
2. Bạn lấy đồng hồ số đo điện áp xem nó có bị nhảy không....
3. Nếu bước 2 ổn rồi bạn kiêm tra nguồn đưa vào chân Vref+/Vref- có ổn định không?(cái này quan trọng lắm)
4. Nếu bước 3 ổn rồi bạn cấu hình tấc độ adc thấp nhất có thể và bắt đầu đo xem sao.
5, Nếu vẫn không được thay con pic khác xem sao?
6. Nếu vẫn không được tôi pó tay. !

meopic
04-01-2010, 04:32 PM
dù sao thì cũng cảm ơn các bác nhìu !! các bác quả là rất nhiệt tình trong việc reply bài post của mình, hehe.
Thứ 1, việc hiển thị lên LCD thì o cần phải bàn (đã ok), sai số ở đây o liên quan j đến LCD cả, có sai là ở chỗ khắc phục việc lấy mẫu ADC như bác tungdh đã nói ( mình xài adc_clock_internal), hoặc do nhiễu đến từ các mạch module.
Thứ 2, ở đây mình đưa ra ý kiến dùng phương pháp lấy giá trị trung bình là mún các bác giúp mình hỉu rõ hơn cũng như bác nào có cao kiến j thì cho mình được học hỏi.
Thứ 3, việc hiển thị là khá chính xác rùi. VD khi o có nhuồn đo thì hiển thị 0,000v tuy nhiên đôi lúc lại hiển thị 0.004 hay 0,009v. Khi có nguồn đo thì thông số hiển thị nháy nhiều, mình dã chỉnh lại thời gian delay nhưng vẫn nháy ở 1 mức độ nào đó ( cug có thể tạm chấp nhận dc), nhưng mình vẫn mún khắc phục điều này đến mức có thể !!!
Thân !!

nhanh0112
04-01-2010, 06:11 PM
Thứ 2, ở đây mình đưa ra ý kiến dùng phương pháp lấy giá trị trung bình là mún các bác giúp mình hỉu rõ hơn cũng như bác nào có cao kiến j thì cho mình được học hỏi.
Đúng là việc lấy chia trung bình thì sẽ bớt nháy hơn (tui đã áp dụng để làm counter). Cộng tổng các lần lấy mẫu rồi số lần lấy mẫu: trungbinh=(a1+a2+...+an)/n
ví dụ dưới đây là lấy 5 mẫu:

ketqua[k]=read_adc();
k++;
if(k>4)k=0;//lay 5 mau de chia trung binh
aver=0;
for(i=0;i<5;i++)
aver+=ketqua[i];
aver=aver/5;
=> dua aver ra tinh toan va hien thi

Với việc đọc liên tục của adc bạn luôn có 5 giá trị liên tiếp cuối cùng lưu trong ketqua[] (trừ 4 lần đầu tiên đọc thôi, nhưng khi hiển thị số sẽ tăng dần đến giá trị cần :D). Bạn có thể tăng số lần lấy mẫu để chia trung bình để số nhảy chậm hơn nữa và chắc là sẽ chính xác hơn.

meopic
04-01-2010, 10:47 PM
đúng là cái mình đag cần. Mình chưa test thử nhưng nhìn sơ qua đoạn code của bạn mình cũng đã hỉu rõ hơn 1 chút về thuật toán này, đúng là hay thật. Thanks nhanh0112 đã chỉ giáo nhé !!

vuthanhcong
20-03-2010, 04:23 PM
chào mọi người

Nhân tiện có luồng bàn về LCD, mình đang sử dụng LCD 1602 và giao tiếp 4 bit sử dụng file thư viện lcd_lib_4bit.c trong tutorial của anh Linh nhưng có cái hàm LCD_setPosition mình còn chưa hiểu rõ, mọi người có thể giải trích dùm mình được không

#separate void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();

hàm SetData thì chỉ làm việc với 4 bit cuối của cX, vậy ở đây anh Linh or với 0x08 tức là set chân D4 lên High, vậy để làm gì nhỉ ?

thaihevip
27-06-2012, 05:15 PM
Hiện nay mình có các mạch điện sau:
1.Giải mã remote sony điều khiển các thiết bị điện từ xa,mạch đã chạy ngon,đã từng bán ra thị trường.
2.Giải mã pt2262/pt2272 điều khiển thiết bị từ xa bằng sóng RF
3.Giải mã pt2248/pt2249 điều khiển thiết bị từ xa dùng sóng hồng ngoại
4.Lập trình đồng hồ có phím chỉnh giờ,phút,giây,hẹn giờ.
5.Lập trình điều khiển led đơn,tạo và thay đổi cường độ sáng cho led,lập trình sáng dồn,sáng chạy,sáng dần 32 led,...
6.Lập trình điều khiển hệ thống đèn giao thông
7.Lập trình chạy chữ trên led ma trận
8.Lâp trình giao tiếp máy tính
9.Lập trình và làm mạch điều khiển xe từ xa,điều khiển động cơ DC
10.Lập trình và điều khiển volume từ xa
11.Dạy vẽ hình ảnh,dạng sóng,đồ thị hàm số,hệ mặt trời và các hành tinh đang chuyển động trên Pascal,C,C++,C#
12.Dạy lập trình vi điều khiển
13.Dạy lập trình PLC bằng ngôn ngữ LAD
14.Dạy vẽ mạch in trên phần mềm protues,vẽ bằng tay,vẽ tự động,tạo chân linh kiện.
15.Làm mạch nguồn hạ áp trực tiếp không dùng biến áp
16.Lập trình làm đồng hồ thời gian thực giao tiếp ds1307,làm đồng hồ vạn niên,lập trình trên 8051 và pic.
17.Hướng dẫn sử dụng các phần mềm liên quan.Bao gồm các phần mềm lập trình cho chip,các phần mềm lập trình hình ảnh và các phần mềm mô phỏng,vẽ mạch in,vẽ mạch nguyên lý.
18.Hiển thị ký tự,hiển thị số đếm trên LCD
...
số phone liên hệ: 0166.495.1093