Advertisement
munther_abdellatif

fat sensor code 1

Apr 5th, 2020
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.31 KB | None | 0 0
  1. #include "Wire.h"
  2. #define button 2
  3. #define SLAVE_ADDR 0x0D      //p15
  4. #define ADDR_PTR 0xB0        //p17
  5.  
  6. #define START_FREQ_R1 0x82   //p11
  7. #define START_FREQ_R2 0x83   //p11
  8. #define START_FREQ_R3 0x84   //p11
  9.  
  10. #define FREG_INCRE_R1 0x85   //p11
  11. #define FREG_INCRE_R2 0x86   //p11
  12. #define FREG_INCRE_R3 0x87   //p11
  13.  
  14. #define NUM_INCRE_R1 0x88    //p11
  15. #define NUM_INCRE_R2 0x89    //p11
  16.  
  17. #define NUM_SCYCLES_R1 0x8A  //p11
  18. #define NUM_SCYCLES_R2 0x8B  //p11
  19.  
  20. #define RE_DATA_R1 0x94      //p12
  21. #define RE_DATA_R2 0x95      //p12
  22.  
  23. #define IMG_DATA_R1 0x96     //p12
  24. #define IMG_DATA_R2 0x97     //p12
  25.  
  26. #define TEMP_R1 0x92         //p11
  27. #define TEMP_R2 0x93         //p11
  28.  
  29. #define CTRL_REG 0x80        //p13 or p11 (D15-D8)-P13
  30. #define CTRL_REG2 0x81       //p13 or p11 (D7-D0)-P13
  31.  
  32. #define STATUS_REG 0x8F      //p11
  33.  
  34.  
  35. const float MCLK = 16.776*pow(10,6);  // AD5933 Internal Clock Speed 16.776 MHz
  36. const float start_freq = 1*pow(10,3); // Set start freq, < 100Khz
  37. const float incre_freq = 1*pow(10,3); // Set freq increment
  38. const int incre_num = 99;             // Set number of increments; < 511
  39.  
  40. char state;
  41.  
  42. void setup() {
  43.     Wire.begin();
  44.     Serial.begin(115200);
  45.     pinMode(button, INPUT);    
  46.  
  47.     //nop - clear ctrl-reg
  48.     writeData(CTRL_REG,0x0);    //P13 (D15-D8)
  49.  
  50.     //reset ctrl register
  51.     writeData(CTRL_REG2,0x10);  //P13 (D7-D0) External Oscillator
  52.  
  53.     programReg();
  54. }
  55.  
  56.  
  57. void loop(){
  58.  
  59.     //Read state and enter FSM
  60.     if(Serial.available()>0) {
  61.         state = Serial.read();
  62.  
  63.         //FSM
  64.         switch(state) {
  65.             case 'A':  //Program Registers
  66.                 programReg();
  67.                 break;
  68.  
  69.             case 'B':  //Measure Temperature
  70.                 measureTemperature();
  71.                 break;
  72.  
  73.             case 'C':
  74.                 runSweep();
  75.                 delay(1000);
  76.                 break;
  77.  
  78.         /////Programming Device Registers/////
  79.  
  80.  
  81.         }
  82.  
  83.         Serial.flush();
  84.     }
  85.  
  86. }
  87.  
  88.  
  89.  
  90.  
  91.  
  92. void programReg(){
  93.  
  94.     // Set Range 1, PGA gain 1
  95.     writeData(CTRL_REG,0x01); //P13 (D15-D8) !!!
  96.  
  97.     // Set settling cycles      ( P11 (511 Cycle *4 =2044))
  98.     writeData(NUM_SCYCLES_R1, 0x07);
  99.     writeData(NUM_SCYCLES_R2, 0xFF);
  100.  
  101.     // Start frequency of 1kHz  
  102.     writeData(START_FREQ_R1, getFrequency(start_freq,1));
  103.     writeData(START_FREQ_R2, getFrequency(start_freq,2));
  104.     writeData(START_FREQ_R3, getFrequency(start_freq,3));
  105.  
  106.     // Increment by 1 kHz
  107.     writeData(FREG_INCRE_R1, getFrequency(incre_freq,1));
  108.     writeData(FREG_INCRE_R2, getFrequency(incre_freq,2));
  109.     writeData(FREG_INCRE_R3, getFrequency(incre_freq,3));
  110.  
  111.     // Points in frequency sweep (100), max 511
  112.     writeData(NUM_INCRE_R1, (incre_num & 0x001F00)>>0x08 );
  113.     writeData(NUM_INCRE_R2, (incre_num & 0x0000FF));
  114.  
  115. }
  116.  
  117.  
  118. void runSweep() {
  119.     short re;
  120.     short img;
  121.     double freq;
  122.     double mag;
  123.     double phase;
  124.     double gain;
  125.     double impedance;
  126.     int i=0;
  127.  
  128.     programReg();
  129.  
  130.     // 1. Standby '10110000' Mask D8-10 of avoid tampering with gains
  131.     writeData(CTRL_REG,(readData(CTRL_REG) & 0x07) | 0xB0);
  132.  
  133.     // 2. Initialize sweep
  134.     writeData(CTRL_REG,(readData(CTRL_REG) & 0x07) | 0x10);
  135.  
  136.     // 3. Start sweep
  137.     writeData(CTRL_REG,(readData(CTRL_REG) & 0x07) | 0x20);
  138.  
  139.  
  140.     while((readData(STATUS_REG) & 0x07) < 4 ) {  // Check that status reg != 4, sweep not complete
  141.         delay(100); // delay between measurements
  142.  
  143.         int flag = readData(STATUS_REG)& 2;
  144.  
  145.  
  146.         if (flag==2) {
  147.  
  148.             byte R1 = readData(RE_DATA_R1);
  149.             byte R2 = readData(RE_DATA_R2);
  150.             re = (R1 << 8) | R2;
  151.  
  152.             R1  = readData(IMG_DATA_R1);
  153.             R2  = readData(IMG_DATA_R2);
  154.             img = (R1 << 8) | R2;
  155.  
  156.             freq = start_freq + i*incre_freq;
  157.             mag = sqrt(pow(double(re),2)+pow(double(img),2));
  158.  
  159.             // phase = atan(double(img)/double(re));
  160.             // phase = (180.0/3.1415926)*phase;  //convert phase angle to degrees
  161.  
  162.             // Phase Calibration
  163.             // sys_phase = 118;
  164.             // phase = phase - sys_phase;
  165.  
  166.             // gain = (1.0/197760)/9786.98;
  167.       //    impedance = 1/(gain*mag);
  168.            
  169.             Serial.print("Frequency: ");
  170.             Serial.print(freq/1000);
  171.             Serial.print(",kHz;");
  172.  
  173.             Serial.print(" Magnitude: ");
  174.             Serial.print(mag);
  175.             Serial.print(",kOhm;");
  176.  
  177.             Serial.print(" Resistance: ");
  178.             Serial.print(re);
  179.             Serial.print(",");
  180.  
  181.             Serial.print(" Reactance: ");
  182.             Serial.print(img);
  183.             Serial.println(",");
  184.  
  185.             // break;  //TODO: for single run, remove after debugging
  186.            
  187.             //Increment frequency
  188.             if((readData(STATUS_REG) & 0x07) < 4 ){
  189.                 writeData(CTRL_REG,(readData(CTRL_REG) & 0x07) | 0x30);
  190.                 i++;
  191.             }
  192.  
  193.         }
  194.     }
  195.  
  196.  
  197.     //Power down
  198. //  writeData(CTRL_REG,0xA0);
  199.     writeData(CTRL_REG,(readData(CTRL_REG) & 0x07) | 0xA0);
  200. }
  201.  
  202.  
  203.  
  204. void writeData(int addr, int data) {
  205.  
  206.  Wire.beginTransmission(SLAVE_ADDR);
  207.  Wire.write(addr);
  208.  Wire.write(data);
  209.  Wire.endTransmission();
  210.  delay(1);
  211. }
  212.  
  213.  
  214. int readData(int addr){
  215.     int data;
  216.  
  217.     Wire.beginTransmission(SLAVE_ADDR);
  218.     Wire.write(ADDR_PTR);
  219.     Wire.write(addr);
  220.     Wire.endTransmission();
  221.  
  222.     delay(1);
  223.  
  224.     Wire.requestFrom(SLAVE_ADDR,1);
  225.  
  226.     if (Wire.available() >= 1){
  227.         data = Wire.read();
  228.     }
  229.     else {
  230.         data = -1;
  231.     }
  232.  
  233.     delay(1);
  234.     return data;   
  235. }
  236.  
  237.  
  238.  
  239.  
  240. boolean measureTemperature() {
  241.  
  242.     // Measure temperature '10010000'
  243.     writeData(CTRL_REG, 0x90);
  244.     //TODO: necessary to write to second control register?
  245.  
  246.     delay(10); // wait for 10 ms
  247.  
  248.    
  249.  
  250.     //Check status reg for temp measurement available
  251.     int flag = readData(STATUS_REG)& 1;
  252.  
  253.   if (flag == 1) {
  254.  
  255.  
  256.     // Temperature is available
  257.     int temperatureData = readData(TEMP_R1) << 8;
  258.     temperatureData |= readData(TEMP_R2);
  259.     temperatureData &= 0x3FFF; // remove first two bits
  260.    
  261.     if (temperatureData & 0x2000 == 1) { // negative temperature
  262.      
  263.       temperatureData -= 0x4000;
  264.     }
  265.    
  266.     double val = double(temperatureData) / 32;
  267.     temperatureData /= 32;
  268.    
  269.     Serial.print("Temperature: ");
  270.     Serial.print(val);
  271.     //Serial.write(176);  //degree sign
  272.     Serial.println("C.");
  273.    
  274.  
  275.     // Power Down '10100000'
  276.     writeData(CTRL_REG,0xA0);
  277.  
  278.    
  279.     return true;
  280.  
  281.   } else {
  282.     return false;
  283.   }
  284. }
  285.  
  286.  
  287. byte getFrequency(float freq, int n){
  288.     long val = long((freq/(MCLK/4)) * pow(2,27));    // !!!
  289.     byte code;
  290.  
  291.       switch (n) {
  292.         case 1:
  293.           code = (val & 0xFF0000) >> 0x10;
  294.           break;
  295.        
  296.         case 2:
  297.           code = (val & 0x00FF00) >> 0x08;
  298.           break;
  299.  
  300.         case 3:
  301.           code = (val & 0x0000FF);
  302.           break;
  303.  
  304.         default:
  305.           code = 0;
  306.       }
  307.  
  308.     return code;  
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement