การทดลองที่ 7 เขียนโปรแกรม Interface กับ DigitalPot

MCP4011

MCP4011

อาจจะมีบางงานที่คุณต้องการจะควบคุณสัญญาณ Analog ด้วย Digital I/O เช่นควบคุม Gain แต่ไม่รู้ว่าจะใช้อะไรควบคุม ลองมาดูตัวนี้ครับครับ MCP4011 Low-Cost 64-Step Volatile Digital POT มีความละเอียด 6 บิต หรือ 64 สเตป ใช้ขาสัญญาณเพียง 2 ขาในการ Interface ขา CS และ U/D

Volatile Digital Potentiometer in SOT-23 packages

64 Taps: 63 Resistors with Taps to VSS and VDD Simple Up/Down (U/D) Protocol Power-up to midscale

  • Resistance Values: 2.1Ohm, 5kOhm, 10kOhm, 50kOhm
  • Low Tempco: – Absolute (Rheostat): <150 ppm (typ.) – Ratiometric (Potentiometer): <10 ppm (typ.)
  • Low Wiper Resistance: 70? (typ.)
  • Low-Power Operation: 1mA Max Static Current
  • Wide Operating Voltage: 1.8V to 5.5V Extended Temperature Range: -40C to +125C
ตำแหน่งขา

ตำแหน่งขา

การเขียนโปรแกรมให้ POT มีค่าลดลง

void increase_pot (unsigned char nstep)
{
unsigned char a,cnt;
UD_POT = 0;
CS_POT = 0;
for (cnt = 0;cnt < nstep;cnt++){ a = 8;
while(a)
a–;
UD_POT = 1;
a = 8;
while(a)
a–;
UD_POT = 0;
}
CS_POT = 1;
}

ให้ขา U/D เป็น “0″ ก่อนแล้วจึงดึง CS ลง “0″ จากนั้นก็ส่ง pulse ไปที่ขา U/D ส่ง pulse ไป 1 ลูกค่า POT จะลดลงไป 1 Step

การเขียนโปรแกรมให้ POT มีค่าเพิ่มขึ้น

void decrease_pot (unsigned char nstep)
{
unsigned char a,cnt;
UD_POT = 1;
CS_POT = 0;
for (cnt = 0;cnt < nstep;cnt++){ a = 8;
while(a)
a–;
UD_POT = 0;
a = 8;
while(a)
a–;
UD_POT = 1;
}
CS_POT = 1;
}

ให้ขา U/D เป็น “1″ ก่อนแล้วจึงดึง CS ลง “0″ จากนั้นก็ส่ง pulse ไปที่ขา U/D ส่ง pulse ไป 1 ลูกค่า POT จะเพิ่มขึ้นไป 1 Step

การทดลอง

การทดลอง MCP4011 DigitalPot
การทดลอง MCP4011 DigitalPot

ทฤษฎีก็ว่ากันไปแล้วมาถึงการทดลอง ผมได้ลองใช้ MCP4011 เป็นตัวปรับ Gain ของ AMP LM386 โดยให้ไมโครคอนโทรลเลอร์ 89S52 รับค่าจากสวิตช์ ถ้ากดสวิตช์เพิ่มเสียง MCP4011 ก็จะเพิ่มค่า R ทำให้เสียงดังขึ้น และจะมีตัวเลขแสดง Step ของ MCP4011 ใชว์ที่จอ LCD16x2 ด้วย ในทางตรงกันข้าม ถ้ากดสวิตช์ลดเสียงก็จะลดค่า R ทำให้เสียงค่อยลง ค่าสูงสุดที่กดได้จะเป็น 64/64 และค่าต่ำสุดเท่ากับ 0/64 สำหรับตัว MCP4011 ถ้าสนใจสามารถซื้อได้ที่ บ. Electronics Source

89S52 Port Define

  • P1.1 <—> CS (MCP4011)
  • P1.2 <—> U/D (MCP4011)
  • P1.3 <—> SW UP
  • P1.4<—> SW UP

Download Code MCS51 การทดลองที่ 7 เขียนโปรแกรม Interface กับ DigitalPotentiometer ควบคุมความดังของเสียงเพลงด้วยการกดปุ่ม

ทำความรู้จักกับ Watchdog Timer

Watchdog หรือแปลเป็นไทยว่าหมาเฝ้าบ้าน เป็นอุปกรณ์ชนิดหนึ่งครับที่ทำหน้าที่ Reset Microcontroller เมื่อ Microcontroller แฮงค์

การทำงานของ Watchdog

Watchdog Timer
Watchdog Timer

ภายใน Watchdog จะประกอบไปด้วย Oscillator และ Timer ตัว Timer นี้จะเริ่มนับไปเรื่อยๆตั้งแต่จ่ายไฟให้กับวงจร เมื่อนับไปถึงค่าสูงสุดของมัน มันก็ส่งสัญญาณไป Reset ไมโครคอนโทรเลอร์ แต่ถ้า Microcontroller ส่งสัญญาณไป Clear Timer ของ Watchdog ก่อนที่ Watchdog จะนับถึงค่าสูงสุด Watchdog ก็จะไม่ Reset Microcontroller

ฉะนั้นในการทำงานปกติ Microcontroller ต้อง Clear Timer ของ Watchdog ภายในเวลาที่กำหนดอยู่ตลอดเวลา ถ้า Microcontroller แฮงค์ ไม่ทำงานก็ไม่มีการ Clear Timer ของ Watchdog ทำให้ตัว Watchdog ส่งสัญญาณมา Reset Microcontroller

ทำไมต้องมี Watchdog?

ในบางงานระบบต้องทำงานตลอด 24 ชม. เช่นระบบส่งสัญญาณดาวเทียม ถ้าเกิดการผิดพลาดหรือมี Noise เข้ามากวนทำให้ Microcontroller? แฮงค์ได้ เมื่อเกิดการแฮงค์ Watchdog จะ Reset Microcontroller ขึ้นมาทำงานใหม่

Microcontroller มี Watchdog อยู่แล้วหรือเปล่า?

Microcontroller ตระกูลใหม่ๆเช่น PIC, AVR มี Watchdog อยู่ในตัวแล้ว หรือแม้แต่ Core MCS51 ที่ผลิตในช่วงหลังๆก็จะมี Watchdog ใส่มาใน IC เลย จึงไม่ต้องต่อ IC Watchdog ข้างนอก แต่ถ้า Microcontroller ตัวนั้นไม่มีก็สามารถต่อ IC Watchdog ได้เช่นเบอร์ MAX1232

เทคนิคการขยาย Port Output ด้วย Shift Register

สำหรับ MCU เบอร์เล็กๆ ที่มีขา I/O ไม่มากนัก เช่น 89C2051 ถ้าเราต้องการขยาย Port แบบ Output ให้ได้เยอะๆ เช่นต้องการจะต่อ 7 Segment ซัก 30 ตัว ถึงจะใช้วิธี Scan Display ก็เถอะ ลองคำนวนดู ใช้ 8 bit สำหรับ data 7 segment และในแต่ละตัวก็ต้อง มีขา Common อีก สรุปว่าคงไม่พอครับ

เทคนิคหนึ่งที่นิยมใช้ก็คือใช้ Shift register ในการขยาย Port โดยเราจะใช้ขา data เพียง 3 ขาเท่านั้น Clock, Data,Strobe IC แต่ละผู้ผลิตอาจจะตั้งชื่อขาสัญญาณแตกต่างกันไปบ้างแต่หลักการเดียวกัน โดย Data จะส่งไปพร้อมกับ Clock หรือที่เรียกการส่งข้อมูลแบบนี้ว่า Synchronous

การต่อสาย 74HC595 แบบอนุกรมหลายตัว

IC ที่นิยมนำมาใช้จะเป็นเบอร์ที่ลงท้ายด้วย 595 เช่น 74HC595, 74LS595, TPIC6B595(Open Collector) การต่อใช้งานขา Data จาก MCU จะต่อเข้ากับ Data in ของตัวที่ 1 และ Data Out ของตัวที่ 1 จะต่อเข้ากับ Data in ของตัวที่ 2 เป็นอย่างนี้ไปเรื่อยๆจนถึงตัวสุดท้าย Data Out ของตัวสุดท้ายจะไม่ถูกต่อ

IC Shift register ตระกูล 595

สำหรับ Code ตัวอย่างนี้ สามารถนำไปประยุกต์ใช้ได้ทุกตระกูล MCS51, AVR, PIC หรือตระูกูลอื่นๆ

อธิบายฟังก์ชัน

Code นี้ต่อ 74HC595 ไว้ 4 ตัวอนุกรมกัน ใน 1 ตัว ตัวแปร Hc595[0] แทน 74HC595 ตัวที่ 1 ไปเรื่อยๆ จนถึง Hc595[3] แทน 74HC595 ตัวที่ 4 การเขียนข้อมูลในแต่ละ byte จะใช้ฟังก์ชัน void wrport8 (unsigned char dat) การส่งข้อมูลไปยัง 74HC595 ทั้ง 4 ตัวใช้ฟังก์ชัน void wrport() เริ่มจาก ให้ OE595 และ STR เป็น “0″ จากนั้นก็ส่งข้อมูล Hc595[0]…Hc595[3] ตอนนี้ข้อมูลจะถูกเก็บไว้ใน D-flipflop ใน 74HC595 แล้ว แต่ยังไม่ถูกส่งออกมายัง Port ข้อมูลจะถูกส่งออกมายัง Port หลังจากส่ง Pulse ไปยัง STR

Code Example

#define SCK_DDR ??DDRB.3??//????????????
#define SDO_DDR ??DDRB.2??//
#define STR_DDR ??DDRB.1??//??
#define OE595_DDR ??DDRB.0??//??#define SCK ???PORTB.3??//
#define SDO ???PORTB.2??//??
#define STR ???PORTB.1??//?????
#define OE595 ???PORTB.0??//??

//—————————————————————————
// Write serial data
//—————————————————————————
void wrport8 (unsigned char dat)
{
?unsigned char cnt,a;
?for (cnt = 0;cnt < 8;cnt++){
??if (dat & 0×80)
???SDO = 1;
??else
???SDO = 0;
??dat <<= 1;
??a = 5;?while(a)?a–;
??SCK = 1;
??a = 5;?while(a)?a–;
??SCK = 0;
?}
}
//—————————————————————————
// Write serial data
//—————————————————————————
void wrport()
{???????????
//?unsigned char a;
?OE595 = 0;
?STR = 0;

? ?wrport8(Hc595[0]);
?wrport8(Hc595[1]);
? ?wrport8(Hc595[2]);
?wrport8(Hc595[3]);?

?STR = 1;????
?STR = 1;?
?STR = 1;?
//?a = 10;?while(a)?a–;
?STR = 0;
}?