วันอาทิตย์ที่ 14 พฤศจิกายน พ.ศ. 2553

PIC18 Tutorial By Joe - แนะนำการใช้งาน MPLAB เบื้องต้น

เนื้อหาโดยพี่โจ้ - จักราวุธ บุญชู - นำเสนอ 09-11-10

ขั้นตอนที่ 1 เปิดโปรแกรม MPLAB

ขั้นตอนที่ 2 การสร้างโปรแจคใหม่โดยเลือกที่ Project >> Project Wizard ดังรูป

แล้วจะขึ้นหน้าดังรูป แล้วกด Next
จากนั้นให้เลือกเบอร์ไอซีที่เราใช้งานแล้วกด Next

ขั้นตอนที่ 3 เป็นการเลือกตัว Compiler ซึ่งใช้ MPLAB C18 C Compiler เป็นตัว Compiler ดังรูป

ขั้นตอนที่ 4 เป็นการตั้งชื่อและเลือกที่จะเก็บไฟล์ แล้วกด Next
ขั้นตอนที่ 5 เป็นการเพิ่มไฟล์เข้าในโปรแจค จากนั้นกด Next แล้วกด Finish


ขั้นตอนที่ 6 เป็นการเขียนโปรแกรมให้เลือก File >> New ดังรูป

แล้วเขียนโปแกรมตัวอย่าง
#include <p18f4550.h>
#include <delays.h> // required for DelayXX() functions
// configuration bit settings
#pragma config FOSC = HS // use high-speed osc. (20MHz), no PLL
#pragma config WDT = OFF // disable WDT
#pragma config LVP = OFF // disable Low-Voltage Programming
#pragma config PWRT = OFF // disable Power-Up Timer
#pragma config BOR = OFF // disable Brown-Out-Reset
#pragma config PBADEN = OFF // disable port B analog input
#pragma config MCLRE = ON // enable master clear reset
void main( void )
{
     TRISB = 0xFF; // all pins on port B are input.
     TRISBbits.TRISB1 = 0; // change the direction of RB1 to output
     LATBbits.LATB1 = 0; // output RB1 Low
     while (1)
      
         LATB ^= 0x02; // toggle output at RB1 and RB2
         Delay10KTCYx( 50 ); // delay for 500,000 instruction cycles
     }
}

เมื่อเขียนโปรแกรมเสร็จแล้วให้กด Save ตั้งชื่อไฟล์ ต่อด้วย .c เช่น lab1.

จากนั้นให้ทำการ Add file โดยการคลิกขวาที่ Source File แล้วเลือก Add File

เมื่อทำการ Add File เรียบร้อยแล้วให้มาตั้งค่าโปรแกรมโดยเลือก Project >> Build Options >> Project ดังรูป

ให้เลือกดังรูป




จากนั้นให้กด Ok แล้วทำการคอมไพ โดยการกด Ctrl+F10 หรือเลือกที่ Project >> Build All

ถ้าเขียนโปรแกรมถูกต้องเมื่อคอมไพล์แล้วจะเป็นดังรูปจากนั้นก็ทำการโหลดโปรแกรมลงไอซี

จบ.....


Uploaded 15-11-10 by NS

วันเสาร์ที่ 31 กรกฎาคม พ.ศ. 2553

Group Meeting วันพฤหัสบดีที่ 15 กรกฎาคม 2553

สรุปการนำเสนอ วันที่ 15 ก.ค. 2553

"การใช้งานโมดูลวัดความเร่งแบบ 3 แกน"

ขออภัยครับ !! หัวข้อนี้ยังอยู่ระหว่างการนำเผยแพร่ ยังไม่เสร็จสมบูรณ์

Group Meeting วันพฤหัสบดีที่ 8 กรกฎาคม 2553

สรุปการนำเสนอ วันที่ 8 ก.ค. 2553

"การสร้างสัญญาณ PWM ด้วย FPGA"

นำเสนอโดย สุรศักดิ์  นาสุริวงค์

     ในการสร้างสัญญาณ PWM ด้วย  FPGA   นั้นผู้สร้างจะต้องเข้าใจหลักการทำงานของวงจร Counter เสียก่อน ซึ่งในการทดลองนี้มีการสร้าง วงจรบน FPGA โดยการเขียนด้วย ภาษา VHDL ซึ่งหลังจากทำการ Synthesize แล้วได้หน้าต่อของวงจรออกมาสองส่วนคือ ส่วนของวงจร  หาความถี่ (Div) และส่วนของการสร้างสัญญาณ PWM (GenPWM) แยกกัน ซึ่งสามารถนำมาต่อ  รวมกันได้ทั้งการเขียนด้วย ภาษา  VHDL  หรือ ว่าใช้เครื่องมือที่ติดมากับตัว Software Xilinx ISE 9.2i เพื่อสร้าง Schematic File เพื่อทำการ Component ระหว่างวงจรทั้งสอง  

1. เปิดโปรแกรม Xilinx ISE 9.2i สร้าง Project ใหม่โดยไปที่
File>New Project ตั้งชื่อ Project
2. เมื่อสร้าง Project ใหม่เสร็จเรียบร้อยแล้ว ก็ทำการ เพิ่มไฟล์ลงใน Project ตามรูปที่ 1

















4. ทำการสร้าง Schematic Symbol ของทั้ง สองวงจร
5. ต่อวงจรทั้งเข้าด้วยกันโดยทำการ เพิ่มไฟล์ คลิกขวาที่ เบอร์ FPGA เลือก New Source ดังรูปที่ 3















6. เลือก Schematic พร้อมทั้งตั้งชื้อ File
7. หลังจากนั้นจะได้หน้าต่างตาม รูปที่ 4


8. ทำการต่อวงจรดังรูปที่ 5 โดยเลือกอุปกรณ์ที่เราทำการ Create Schematic Symbol โดยเลือกมาจาก  หน้าต่าง Source ดูที่ ช่อง Categories เลือกตามที่อยู่ของไฟล์ที่สร้างสร้าง Schematic Symbol







                                                                                            
9. หลังจากทำการต่อวงจรเรียบร้อยแล้ว ทำการ Save จะเห็นได้ว่า ไฟล์ที่สร้างใหม่จะเป็น Top module เพื่อใช้ในการ Synthesize วงจร
10. หลังจากนั้นก็ทำการ Synthesize วงจร Assign Package ตามลำดับ
11. จากนั้นทำการ Implement และ Generate Programming File ตามลำดับ
12. ทำกระบวนการ iMPACT เพื่อเอาโปรแกรมลง FPGA

วันพฤหัสบดีที่ 1 กรกฎาคม พ.ศ. 2553

Group Meeting วันพฤหัสบดีที่ 1 ก.ค. 2553

สรุปการนำเสนอ วันที่ 1 ก.ค. 2553

"การทดลองใช้  Arduino ควบคุมอุณหภูมิด้วยระบบ PID"

นำเสนอโดย จักราวุธ บุญชู

ระบบ PID เป็นวิธีการควบคุมระบบแบบหนึ่ง ประกอบด้วยการคำนวณสมการทางคณิตศาสตร์ 3 ส่วน คือ Proportional, Integral และ Derivative control โดยทั้ง 3 ส่วนนี้จะทำหน้าที่หลักต่างกัน เพื่อช่วยกันส่งเสริมและชดเชยการควบคุม ให้มีเสถียรภาพที่สุด แต่อย่างไรก็ตาม PID control ก็อ้างอิงสมการทางคณิตศาสตร์ แต่ในการทดลองนี้ได้เรียกใช้ Library PID    ที่มีสมการทางคณิตศาสตร์อยู่แล้วซึ่งสามารถเรียกใช้งานได้เลยเพียงป้อนค่าอินพุต ค่าที่ต้องการ  ค่า Kp  Ki  Kd ให้ฟังก์ชัน ก็จะมีการคำนวณค่าเอาท์พุตที่จะทำค่าอินพุตเข้าหาค่า ที่ต้องการ

การทดลอง
1. เปิดโปรแกรมแล้วเลือก File > Examples > PID_Beta6 > Example > PIDSample   เมื่อเปิดขึ้นมาแล้วจะได้ code ดังรูป







































คำสั่งที่เกี่ยวข้องกับ Library PID
PID myPID(&Input, &Output, &Setpoint,2,5,1);คือ คำสั่งส่งและรับค่าให้กับฟังก์ชันใน Library ที่มีการรับค่า อินพุต เอาท์พุต ค่าทีเราต้องการ ค่า Kp , Ki ,Kd ตามลำดับ
Set point = xxxx; คือ การตั้งค่าที่ต้องการ
myPID.SetMode(AUTO); คือ คำสั่งเปิดลูปเปิด PID ให้มีการทำงานแบบอัตโนมัติ ซึ่งใน Library นี้มีให้เลือกอยู่  2 โหมด คือ Auto และ Manual
myPID.Compute(); คือ คำสั่งเรียกใช้ฟังก์ชันคำนวณ

จากรูปที่ 2 ให้เพิ่มคำสั่งเพื่อให้โปรแกรมแสดง ค่า อินพุต เอาท์พุต และค่าที่เราต้องการ ด้วยคำสั่ง
Serial.print(" ");  และทำการกำหนด Baud rate ด้วยคำสั่ง Serial.begin(9600);
ดังรูปที่ 3




















จากนั้นทำการ Compiler เมื่อไม่มี error แล้วให้ตรวจสอบว่า Port com ที่ใช้ตรงกันหรือยัง และต้องดูด้วยว่าเบอร์ไอซีที่ให้นั้นถูกต้องหรือไม่ ดังรูปที่ 4 รูปที่ 5 และ รูปที่ 6





















เมื่อตรวจสอบเรียบร้อยแล้วให้ทำการโหลดโปรแกรมเข้าไอซี จะนั้นก็ต่อวงจรเพื่อทดลอง ดังรูปที่ 7 และ รูปที่ 8






































สามารถดูค่า  อินพุต เอาท์พุต ได้โดยการเปิดหน้าต่าง Terminal ดังรูปที่ 9




















จากเห็นได้ว่าการที่เราดูค่าจะ Terminal นั้นจะมองได้ยากว่าการลู่เข้าจะช้าหรือเร็ว ดังนั้นต้องมีเขียนกราฟเพื่อที่ให้มองได้ง่ายขึ้นโดยใช้โปรแกรม processing ต้องเพิ่ม code ดังนี้

#include
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint,2,5,1);
unsigned long serialTime;
void setup()
{        

   Serial.begin(9600);
   Input = analogRead(0);
   Setpoint = 100;
   myPID.SetMode(AUTO);
}
void loop()
{
  Input = analogRead(0);
  myPID.Compute();
  analogWrite(3,Output);
  if(millis()>serialTime)
  {
        SerialReceive();
        SerialSend();
        serialTime+=5;
   }
  delay(500);
}
union {               
  byte asBytes[24];   
  float asFloat[6];   
}                     
foo;                  
void SerialReceive()
{
  int index=0;
  byte Auto_Man = -1;
  while(Serial.available()&&index<25)
  {
    if(index==0) Auto_Man = Serial.read();
    else foo.asBytes[index-1] = Serial.read();
    index++;
  }
  if(index==25  && (Auto_Man==0 || Auto_Man==1))
  {
    Setpoint=double(foo.asFloat[0]);

    if(Auto_Man==0)                  
    {                                   
      Output=double(foo.asFloat[2]);    
    }                                    
   
    double p, i, d;                     
    p = double(foo.asFloat[3]);         
    i = double(foo.asFloat[4]);          
    d = double(foo.asFloat[5]);          
    myPID.SetTunings(p, i, d);           
   
    if(Auto_Man==0) myPID.SetMode(MANUAL);
    else myPID.SetMode(AUTO);            
  }
  Serial.flush();                        
}
void SerialSend()
{
  Serial.print("PID ");
  Serial.print(Setpoint);  
  Serial.print(" ");
  Serial.print(Input);  
  Serial.print(" ");
  Serial.print(Output);  
  Serial.print(" ");
  Serial.print(myPID.GetP_Param());  
  Serial.print(" ");
  Serial.print(myPID.GetI_Param());  
  Serial.print(" ");
  Serial.print(myPID.GetD_Param());  
  Serial.print(" ");
  if(myPID.GetMode()==AUTO) Serial.println("Automatic");
  else Serial.println("Manual");
}

เมื่อเขียนโปรแกรมเรียบร้อยแล้วก็ทำการโหลดโปรแกรม และเปิดโปรแกรม Processing ไฟล์ชื่อ PID_Plot  แล้วกดรันโปรแกรม ดังรูปที่ 10

 





























วันศุกร์ที่ 11 มิถุนายน พ.ศ. 2553

Group Meeting วันพฤหัสบดีที่ 17 มิ.ย. 2553

สรุปการนำเสนอ วันที่ 17 มิ.ย. 2553

"Introduction to Verilog HDL"

นำเสนอโดย มณฑล ไวยครุท





การทดลองที่ได้นำเสนอ 
     เป็นตัวอย่างการสร้างวงจรดิจตอลบน FPGA ซึ่งใช้ชิป FPGA ตระกูล Spartan-3E ของ Xilinx และใช้โปรแกรม Xilinx ISE 9.2i ในการสังเคราะห์วงจร   สำหรับตัวอย่างการสร้างวงจรที่นำเสนอเป็นการสร้างวงจรหารความถี่ จากความถี่ 50 MHz ให้มีความถี่ 5 Hz โดยใช้ IP Core ของ Xilinx ที่ชื่อว่า DCM (Digital Clock Manager) นำมาใช้งานร่วมกับการสร้างวงจรที่โปรแกรมด้วยภาษา Verilog HDL ซึ่งมีบล็อกไดอะแกรมดังรูป









จากรูปวงจรจะมีการทำงานแบ่งออกเป็น 3 ส่วน คือ
     1. DCM  เป็นวงจรหารความถี่จากสัญญาณ clk 50 MHz ลง 10 เท่า คือวงจรจะให้ค่า Output มีความถี่เท่ากับ 5 MHz
     2. DIV1_1000  เป็นวงจรหารความถี่ในชุดที่ 2 โดยการนำสัญญาณ clk ความถี่ 5 MHz มาหารลง 1000 เท่า ซึ่ง Output ของวงจรในส่วนนี้จะให้ความถี่เท่ากับ 5 KHz
    3.  DIV2_1000  เป็นวงจรหารความถี่ในชุดที่ 3 โดยการนำสัญญาณ clk ความถี่ 5 KHz มาหารลง 1000 เท่า ซึ่ง Output ของวงจรในส่วนนี้จะให้ความถี่เท่ากับ 5 Hz  ซึ่งเป็น Output  ของระบบไปใช้งาน

ขั้นตอนการทดลอง

1.  เริ่มต้นการใช้งาน WebPack ISE ดับเบิ้ลคลิ๊กที่ไอคอน Xilinx ISE 9.2i













2.  Project Name: Counter (ชื่อโปรเจคที่ต้องการสร้าง)
3.  เลือก Next
4.  เติมรายละเอียดดังนี้ ดังรูป
     Family : Spartan3E
     Device : XC3S500E
     Package : FG320
     Speed Grade : -4 (10 nano sec : ns.)  
     Top-Level Module Type : HDL
     Synthesis Tool : XST (VHDL/Verilog)
     Simulation : ISE Simulation (VHDL/Verilog)
     Preferred Language :  Verilog















5.  เลือก Next
6.  เลือก New Source ใช้เมาส์คลิกไปที่ Verilog Module และพิมพ์ชื่อลงใน File Name ชื่อ
     Div1_1000
7.  เลือก Next จะปรากฏหน้าต่าง  Define Module ให้กำหนด ชื่อพอร์ท ทิศทางของพอร์ท ดังนี้
     clk_50M : input
     rst : input
     clk_out : output
8.  เลือก Next จะปรากฏหน้าต่าง ที่รายงาคุณสมบัติเบื้องต้นของ  Source และเลือก Finish
9.  เลือก Next
10.เลือก Finish ดังรูป















11.ทำการเขียนโปรแกรมต่อจาก output  (copy file จากไฟล์ชื่อ Div1_1000) ดังตัวอย่าง

    module Div1_1000(clk_50M, rst, clk_out);
    input clk_50M;
    input rst;
   output reg clk_out;

   reg [9:0] count;
   always @ (posedge clk_50M or negedge rst) begin
   if(!rst)
      clk_out = 0;
   else
      if(count != 1000)
         count = count + 1;
      else begin
         count = 0;
         clk_out = !clk_out;
      end
   end
endmodule

12. ตรวจสอบความถูกต้อง คิกเมาส์ ที่เครื่องหมายบวกหน้า Implement Design ในหน้าต่าง Processes for  Source จะปรากฏดังรูป













13.  ทำการ Simulation โดยคลิกขวาที่ Div1_1000 ของหน้าต่าง Source เลือก New Source…. ดังรูป




















14.  จะปรากฏหน้าต่าง Select  Source Type เลือก Test Bench Waveform พิมพ์ชื่อลงใน File Name : sim_Div1  คลิก Next ----> Next ----> Finish
15.  จะปรากฏหน้าต่าง initialize Timing และกำหนดค่าดังรูป คลิก Finish




















16.  จะปรากฏหน้าต่าง และกำหนดค่าที่พอร์ท rst_in ดังรูป











17.  ทำการ Save และในหน้าต่าง Source เลือก Behavioral Simulation ซึ่งจะเห็นไฟล์ชื่อ sim_Div1.tb
18.  ทำการเลือก sim_Div1.tbw  ในหน้าต่าง Process คลิกเครื่องหมายบวกที่ Xilinx Simulation ดับเบิ้ลคลิกที่ Simulate Behavioral Model จะปรากฏผลการ Simulation ดังรูป






19.  ทำการเขียนโปรแกรม Div2_1000 โดยกลับไปที่หน้าต่าง Synthesis/Implementation คลิกขวาที่ Div1_1000 ของหน้าต่าง Source เลือก New Source
20.  ทำการตั้งชื่อ Div2_1000 และทำการเขียนโปรแกรม (copy file จากไฟล์ชื่อ Div2_1000) และ Save
21.  ทำการเรียก DCM โดย คลิกขวาที่ Div1_1000 ของหน้าต่าง Source เลือก New Source
22.  เลือก IP(Coregen & Architecture Wizard) พิมพ์ชื่อ File name : Gen_5M และคลิก Next ดังรูป













23.  ในหน้าต่าง Select IP เลือก Single DCM v9.1i จากหัวข้อ FPGA Features and Design ---> Clocking ---> Spatan-3 แล้วคลิก Next จนกระทั่ง Finish













24.  ในหน้าต่าง Xilinx Clocking Wizard-General Setup ใส่ค่าตามรูป และคลิก Next จนกระทั่ง Finish




















25.  ทำการเชื่อมต่อวงเข้าด้วยกันด้วยการเขียนโปรแกรม คลิกขวาที่ Div1_1000 ของหน้าต่าง Source เลือก New Source
26.  ทำการตั้งชื่อ Topmodel  และทำการเขียนโปรแกรม (copy file จากไฟล์ชื่อ Topmodel) และ Save
27.  ทำการ Simulation โดยคลิกขวาที่ Topmodel และทำตามข้อที่ 13-18
28.  ทำการโปรแกรมลงชิป(Hardware Configuration) คลิกขวาที่ Topmodel ของหน้าต่าง Source เลือก New Source
29.  เลือก ไฟล์ UCF พิมพ์ชื่อ File Name : map Next จนกระทั่ง Finish
30.  ที่ map.ufc และทำการเขียนโปรแกรม (copy file จากไฟล์ชื่อ map) ลงใน User Constraint File และ Save
31.  ทำการสร้าง Configuration File (.bit) เพื่อโปรแกรมลงชิป  FPGA ดับเบิ้ลคลิก และทำการโปรแกรมดังรูป