Nút bấm ADC

t10000

Trứng gà
Về nguyên lý, nút bấm ADC thưc hiện cũng dễ dàng, tôi dùng 7 điện trở 1k nối tiếp với nhau giữa nguồn và đất tạo ra 6 điểm lấy mẫu nối với 6 nút bấm để cho AN0 đọc trị.
Với mạch test thử để nhận biết nút nhấn rất OK, trị đọc được từ chương trình test so với trị tính toán từ lý thuyết khớp hầu hết cả các nút và nút nào có trị chênh cũng chỉ sai đúng 1 (tức là nếu tính bằng 343 thì chương trình đọc ra cũng 332,343 hoặc 344).
Tuy nhiên dùng cho mạch thực tế có sự rắc rối khó giải quyết là sau khi buông phím, giá trị ADC vẫn còn được đọc lại với một giá trị khác ở vòng lặp tiếp sau, lý do là điện áp tại nút bấm không giữ nguyên hoặc bằng 0 mà xả giảm theo đồ thị xung.
Giá trị đọc sau này sẽ kích hoạt lệnh xử lý khác của chương trình ngoài mong muốn.
Các anh chị và bạn bè xin vui lòng gợi ý (càng kỹ càng tốt) làm thế nào đọc ADC xong là OFF ngay ADC trong thời gian nào đó (ví dụ 500ms) rồi mới đọc tiếp, khi đó thì ADC_value đã bằng 0 rồi.

Xin cảm ơn anh chị và các bạn quan tâm.
 

huunho

Trứng gà
ban lắp thêm trở 10 vào chân AN0 và nối GND xem sao, sau đó đọc xong ADC 1 nút thì tạo trễ vừa phải để qua thời gian xả tụ chứ 500ms là lâu quá
 

t10000

Trứng gà
ban lắp thêm trở 10 vào chân AN0 và nối GND xem sao, sau đó đọc xong ADC 1 nút thì tạo trễ vừa phải để qua thời gian xả tụ chứ 500ms là lâu quá
Cảm ơn bạn đã quan tâm,
tuy nhiên vẫn chưa hiểu vì bạn ghi thiếu ký tự: 10 là 10 ohm hay 10K, tuy nhiên cả hai nếu mắc từ AN0 xuống mass sẽ làm ảnh hưởng ít nhiều đến điện thế điểm lấy mẫu, mình có gắn điện trở như vậy nhưng là 1M cùng với 1 tụ // là 104.
Tạo trễ thì không muốn vì nó làm ảnh hưởng đến các việc khác ví dụ quét LED.
Có lẽ từ gợi ý của bạn mình sẽ dùng TIME0.
Tuy nhiên cho mình hỏi lệnh để tắt nhế độ ADC có phải là setup_adc(ADC_OFF) và rồi khi khởi động lại chế độ adc thì dùng read_adc(ADC_START_ONLY) phải không bạn?
Cái mình cần là tắt mở chế độ đọc, mình sẽ xử lý sau lệnh đọc lưu vào biến là tắt ngay, đợi thời gian đủ lâu mới phát lệnh đọc tiếp.

Mong các bạn giúp đỡ tiếp!
 

huunho

Trứng gà
Mình nói đến trở 10k, bạn nên đọc 1 lần rồi dừng đọc ADC để làm việc khác , ko tạo trễ cũng như ko dùng timer mà đếm số lần đúng điện áp thì kết luận là phím đang được ấn. Ví dụ đọc ADC lần 1 thấy nút đang ấn, sau đó dừng đọc và làm việc khác, tiếp đó lại đọc tiếp lần 2,.... đếm số lần đọc trên 100 lần thì kết luận phím đang ấn, còn nếu đến 1 lần nào đó phím ko dược ấn thì re set biến đếm.

Thuật toán là thế, vì ko biết bạn nói đến vi điều khiển nào nên mấy lệnh trên ko biết đúng hay sai
 

t10000

Trứng gà
à, chắc bạn chưa hiểu ý mình , vì là thế này:
( ví dụ nhé, mình dùng PIC16 - code CCS)

void main()
{
.....
.....
while (true)
{
//... làm một số việc
value=doc_phim_adc();
// ..... làm cái gì đó nữa
}
}

giá trị value sẽ được dùng để chọn lựa xử lý công việc
vấn đề là xử lý xong như ý rồi nhưng quay lại vòng lặp vẫn còn sót lại value (điện áp trễ)
Mình ước gì nó tuột ngay xuống bằng 0 hoặc là vòng lặp trễ để đọc chậm khi điện áp bằng 0, nhưng mà trễ thì không ổn vì còn phải quét LED hiển thị
Ý là vậy
cảm ơn bạn!
 

huunho

Trứng gà
bạn lấy 1 biến để lưu giá trị điện áp trễ này và khi điện áp trễ về 0 thì thục hiện công việc mong muốn.

while (true)
{
//... làm một số việc

if( value <> doc-phim_adc())
{
value=doc_phim_adc();
xư lý phím
}
// ..... làm cái gì đó nữa
}
}
 

t10000

Trứng gà
bạn lấy 1 biến để lưu giá trị điện áp trễ này và khi điện áp trễ về 0 thì thục hiện công việc mong muốn.

while (true)
{
//... làm một số việc

if( value <> doc-phim_adc())
{
value=doc_phim_adc();
xư lý phím
}
// ..... làm cái gì đó nữa
}
}
thì đúng là vậy rồi, nhưng mà vấn đề là làm hết cái lặp while rồi quay lại vẫn còn dư cái điện áp rơi trên nút cũ, và thế là nó đọc giá trị và làm tiếp cái lệnh tiếp theo thuộc về điện áp này, mình muốn cho nó về 0 rồi mới đọc tiếp. Và như vậy muốn cần phải sau một thời gian đủ lâu (lâu hơn thời gian quay trở lại lần lặp tiếp theo dù vẫn phải lặp để mà xử lý chuyện khác, đủ thời gian điện áp về 0) mới khởi đọc lại adc.
Mình làm thế này, tạo một biến đếm thời gian, và cứ sau khoảng thời gian chỉ định (t) thì giá trị được đọc mới dùng xử lý cho công việc (ý nghĩa tương tự như delay, nhưng mà không bắt vi xử lý phải dừng)
Cảm ơn bạn đã góp ý,
Chào thân!
 

huunho

Trứng gà
đó cũng là 1 cách đấy, bạn thử xem có hiệu quả ko? Mình nghĩ nên thực hiện lên khi có tín hiệu từ 0 lên giá trị ADC, còn khi giá trị không thay đổi thì không thực hiện gì. chắc bạn biết cách làm này
 

t10000

Trứng gà
đó cũng là 1 cách đấy, bạn thử xem có hiệu quả ko? Mình nghĩ nên thực hiện lên khi có tín hiệu từ 0 lên giá trị ADC, còn khi giá trị không thay đổi thì không thực hiện gì. chắc bạn biết cách làm này
Ok, theo cách này của bạn khỏi xét time0
Thanks!
 
Top