000

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers LAB4.cpp Source File

LAB4.cpp

00001 #include "mbed.h"
00002 /**********************
00003  *      MCP4922
00004  **********************/
00005  
00006 ///SPI Interface
00007 SPI MCP4922_SPI(D11,D12,D13);//MOSI ,MISO ,SCK
00008 DigitalOut MCP4922_CS(D10);//CS
00009 
00010 //Digital Output
00011 DigitalOut MCP4922_LDAC(D8);
00012 DigitalOut MCP4922_SHDN(D9);
00013 
00014 //Analog input
00015 AnalogIn ana(A0);
00016 AnalogIn ou(A1);
00017 //for change mode
00018 DigitalIn sw(D7);
00019 
00020 Serial ser(D1,D0);
00021 //for 7 segment
00022 DigitalOut sd(PC_0);
00023 DigitalOut sc(PC_1);
00024 DigitalOut sb(PB_0);
00025 DigitalOut sa(PA_4);
00026 DigitalOut sdo(D15);
00027 
00028 
00029 DigitalOut s2d(D6);
00030 DigitalOut s2c(D5);
00031 DigitalOut s2b(D4);
00032 DigitalOut s2a(D3);
00033 
00034 void ss(float x)
00035 {
00036     int nu1 = x/1000;
00037     int nu15= (int)x%1000;
00038     int nu2=nu15/100;
00039     BusOut a(PC_0,PC_1,PB_0,PA_4);
00040     a=nu1;
00041     BusOut b(D3,D4,D5,D6);        
00042     b=nu2;
00043     sdo=1;
00044     
00045 }
00046 int main()
00047 {
00048     /******************************
00049      *****      setup       *******
00050      ******************************/
00051 
00052     /////////setup SPI//////////
00053     //set CS High
00054     MCP4922_CS=1;//สั่ง slave select หรือก็คือยังไม่ให้ mc4922 ทำงาน ถ้าให้ทำงานต้องส่งเป็น =0
00055 
00056     //set SPI mode [1,1]=> mode 3 @16bit
00057     MCP4922_SPI.format(16,3);// 16= จำนวนบิตที่จะส่ง ดูได้จาก datasheetของ mpc4922 bit0-bit15  3= clock polarity=1  clock phase=1
00058 
00059     //set SPI Frequency @20MHz
00060     MCP4922_SPI.frequency(1000000);
00061 
00062     //set Load DAC High (inactive)
00063     MCP4922_LDAC = 1;
00064 
00065     //set shutdown DAC High (inactive)
00066     MCP4922_SHDN = 1;
00067 
00068     //loop
00069     while(1) {
00070         
00071         /******************************************************************************
00072          * Set DAC output channal A @ 2.5v  Vref = 3.3v , DAC 12 bit ,Gain =0, Unbuffer
00073          * So DAC data = 3103
00074          * SPI data format CH,BUF,GA,SHDN,DATA[12:0]
00075          ******************************************************************************/
00076 
00077         /////prepare Data to tranfer/////
00078         //create data buffer
00079         uint16_t MCP4922_Sent_Data = 0; //MCP4922-Sent_Data เป็นตัวแปรขนาด 16bit
00080         
00081         int num;
00082         
00083         //switch mode
00084         if(sw==1){
00085             num=ana.read()*3.3*4096/3.31;
00086             }
00087         else {num=3.3-(ana.read()*3.3*4096/3.31);}
00088         
00089         //Set MCP4922_Sent_data[12:0] to expected DAC output
00090         MCP4922_Sent_Data = num & 0x0FFF;/*3103=DAC input code from analog output voltage (Vout) in datasheet    0x0FFF=bitwise 0000 1111 1111 1111 
00091         โดยนำ 3103 แปลงเป็นเลขฐานสอง ซึ่งจะมีเพียง 12 บิต แล้วนำเลขนั้นมา and กับ FFF ของ 0x0FFF ทำให้ตัวมันเอง ( อะไร and กับ 1 จะได้ตัวมันเอง)*/
00092         //Set Channal to output A => CH = 0 โดย set bit15=0
00093         MCP4922_Sent_Data |= 0b1000000000000000;
00094 
00095         //Set Buffer mode to Unbuffer => BUF = 0 โดย set bit14=0
00096         MCP4922_Sent_Data &= 0b1011111111111111;
00097 
00098         //Set GAIN mode to 1 => GA = 1 โดย set bit13=1
00099         MCP4922_Sent_Data |= 0b0010000000000000;
00100 
00101         //Set Shutdown channal mode to inactive => SHDN = 1 โดย set bit12=1
00102         MCP4922_Sent_Data |= 0b0001000000000000;
00103 
00104         /////sent data to MCP4922/////
00105         //set CS to LOW to activated MCP4922 SPI Interface สั่งให้เริ่มทำงานโดยให้ shift select=0
00106         MCP4922_CS = 0;
00107 
00108         //sent data buffer to mcp4922 แต่ output ยังไม่ออกเพราะ LDAC=1 อยู่
00109         MCP4922_SPI.write(MCP4922_Sent_Data);
00110 
00111         //set CS to High to End MCP4922 SPI Interface สั่งหยุดการทำงานโดยให้ shift select=1
00112         MCP4922_CS = 1;
00113 
00114         //set LDAC to LOW to Load data to output  Output ออกแล้วเพราะ LDAC=0
00115         MCP4922_LDAC = 0 ;
00116         
00117         //wait at least 100ns = 0.1 microsec ..... So set at 1 microsec
00118         wait_us(1);
00119         
00120         //set LDAC to High to prepare next output Output จะไม่ออกจนกว่า LDAC จะ=0
00121         MCP4922_LDAC = 1 ;
00122         ss(ana.read()*3300);
00123         //ser.printf("%0.2f \n",ou.read()*3.3);
00124         wait(0.01);
00125     }
00126 }