ค้นหาบล็อกนี้

วันเสาร์ที่ 19 กุมภาพันธ์ พ.ศ. 2554

การแสดงผลสัญญาณ Analog to Digital ที่ Computer

การแสดงผลสัญญาณ Analog to Digital ที่ Computer
         ได้เลือกใช Microcontroller model dspic ส่วน software ที่แสดงผลได้ใช้ Visual c# ที่ค่อนข้างในการใช้งานเพราะจะคล้ายภาษา C,C++ แต่จะง่ายกว่า ในการติดต่อเป็นแบบ serial port เพื่อรับค่าจาก Microcontroller โดยเริ่มแรกเราจะมา setup ในส่วนของ Microcontroller ก่อนเพื่อทำการอ่านค่า Analog ทำการแปลงสัญญาณเป็น digital
          ขั้นตอนแรกเราต้องทำการ set ใน mode ของ Microcontroller ก่อนโดยจะ set ขา port ก่อนเมื่อ set ADC เสร็จแล้วทำการ Set การใช้งาน Serial port  หรือ uart ใน Microcontroller dspic นี้ โดย code program บ้างอั่นได้อ้างอิงจาก INEX code program สามารถศึกษาได้ดังนี้

#include // Header file for dsPIC30F2010

#include // Module function for 10 bit ADC
#include
#define NUMBER_OF_DIGITS 32
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & BORV_27 & PWRT_16 & MCLR_EN);
_FGS(CODE_PROT_OFF);
void convertint(unsigned int value);
void convert(char *p);
void sendUart();
void _ultoa(unsigned long value, char* string, unsigned char radix);
void _ltoa(long value_l, char * string_l, unsigned char radix_l);
int common;
void _ISR _FLTAInterrupt(void)

{
         IFS2bits.FLTAIF = 0;
}
void __attribute__((__interrupt__)) _U1TXInterrupt(void)
{
        IFS0bits.U1TXIF = 0;
        sendUart();
}
void _ISR _U1RXInterrupt(void)
{
        IFS0bits.U1RXIF = 0;
}
void _ISR _ADCInterrupt(void)
{
         IFS0bits.ADIF = 0;
}
void adc_init() // Set mode Analog to digital//
{
        ADCON1 = 0x8006;
        ADCON2 = 0x0404;
        ADCON3 = 0x0010;
        ADCHS = 0x0000;
        ADPCFG = 0xFFFE;
        ADCSSL = 0x0001;
}
void uart1_init() //Set mode Serial port//
{
       U1MODE = 0x8000;
       U1STA = 0x8480;
       U1BRG = 47;
       IEC0bits.U1TXIE = 1;
       IEC0bits.U1RXIE = 1;
       IPC2bits.U1TXIP = 5;
       IPC2bits.U1RXIP = 2;
}
void sendUart(){ //Sent data ADC ผ่านทาง Serial port//
      unsigned int bufUart;
      controlADC();
      bufUart = common;
      convertint(bufUart);
      while(BusyUART1());
      putsUART1((unsigned int *)"\r\n");
      while(BusyUART1());
}
void controlADC(){
      ADCON1bits.SAMP = 1;
      while(!ADCON1bits.SAMP);
      ConvertADC10();
      while(ADCON1bits.SAMP);
      common = ADCBUF0;
}
 void _ultoa(unsigned long value, char* string, unsigned char radix)
{
      unsigned char index; // Counter of digit
      char buffer[NUMBER_OF_DIGITS]; // Data buffer
      index = NUMBER_OF_DIGITS; // Load counter by digit count
     do
    {
             buffer[--index] = '0' + (value % radix); // Convert configuration by radix(10 or 16)
             if ( buffer[index] > '9') buffer[index] += 'A' - '9' - 1; // For base over 10(base 16)
             value /= radix; // Div by to calculate into next digit
     }     while (value != 0); // End for convert?
     do
    {
           *string++ = buffer[index++]; // Load convert value to string buffer
      } while ( index < NUMBER_OF_DIGITS ); // Over of digit count?
     *string = 0; // Place null for end string
}
void _ltoa(long value_l, char * string_l, unsigned char radix_l)
{
       if (value_l < 0 && radix_l == 10)
      {
              *string_l++ = '-';
              _ultoa(-value_l, string_l, radix_l);
       }
       else
      {
             _ultoa(value_l, string_l, radix_l);
       }
}
void convertint(unsigned int value)
{
       char buff[12];
      _ltoa(value,&buff[0],10);
      convert(&buff[0]);
}      
void convert(char *p)
{
       while(*p)
      {
              U1TXREG =*p;
              while(BusyUART1());
              p++;
      }
}
int main(void)
{
         adc_init();
         uart1_init();
         while(1);
}
         ต่อไปจะเป็นส่วนของ computer โดยใช้โปรแกรม Visual C# 2008 และ code program

 


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
namespace serial_c_2
{
       public partial class Form1 : Form
{
SerialPort _serialPort;
private delegate void SetTextDeleg(string text);
public Form1()
{
        InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
      _serialPort = new SerialPort("COM10", 9600, Parity.None, 8, StopBits.One);
      _serialPort.Handshake = Handshake.None;
      _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
      _serialPort.ReadTimeout = 1000;
      _serialPort.WriteTimeout = 1000;
}
private void button1_Click(object sender, EventArgs e)
{
       try
       {
        if (!_serialPort.IsOpen)
         _serialPort.Open();
        _serialPort.Write("a");
        }
       catch (Exception ex)
      {
            MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
       }
}
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
         string data = _serialPort.ReadLine();
         this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
}
private void si_DataReceived(string data)
{
         textBox1.Text = data.Trim();
}
private void button2_Click(object sender, EventArgs e)
{
        try
        {
                  if (!_serialPort.IsOpen)
                 _serialPort.Open();
                _serialPort.Write("0");
                _serialPort.Close();
        }
        catch (Exception ex)
       {
                MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
}
private void button3_Click(object sender, EventArgs e)
{
        try
       {
                  _serialPort.Write(textBox2.Text );
        }
        catch (Exception ex)
       {
                    MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
        }
}
}
}
      เสร็จแล้วทำการ Run program