000
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Aug 9 2022 18:03:49 by
1.7.2