First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5
hmc5883.h@8:c5dc1ce10722, 2020-03-26 (annotated)
- Committer:
- skyscraper
- Date:
- Thu Mar 26 21:13:44 2020 +0000
- Revision:
- 8:c5dc1ce10722
- Parent:
- 3:2834be4e10ef
Try to make magnetometer more generic. Next to do a mag service and put in own thread
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
skyscraper | 2:9ffb2f18756b | 1 | |
skyscraper | 8:c5dc1ce10722 | 2 | #ifndef SKYSCRAPER_MBED_HMC5883L_H_INCLUDED |
skyscraper | 8:c5dc1ce10722 | 3 | #define SKYSCRAPER_MBED_HMC5883L_H_INCLUDED |
skyscraper | 2:9ffb2f18756b | 4 | |
skyscraper | 8:c5dc1ce10722 | 5 | #include "magnetometer.h" |
skyscraper | 8:c5dc1ce10722 | 6 | #include "I2CBusDevice.h" |
skyscraper | 2:9ffb2f18756b | 7 | |
skyscraper | 8:c5dc1ce10722 | 8 | struct hmc5883L : I2CBusDevice{ |
skyscraper | 8:c5dc1ce10722 | 9 | |
skyscraper | 8:c5dc1ce10722 | 10 | hmc5883L(I2C& i2cIn,uint8_t addressIn); |
skyscraper | 2:9ffb2f18756b | 11 | |
skyscraper | 8:c5dc1ce10722 | 12 | bool detected(bool verbose)const; |
skyscraper | 8:c5dc1ce10722 | 13 | |
skyscraper | 8:c5dc1ce10722 | 14 | bool data_ready()const; |
skyscraper | 8:c5dc1ce10722 | 15 | |
skyscraper | 8:c5dc1ce10722 | 16 | // assume mag_data_ready has returned true before call |
skyscraper | 8:c5dc1ce10722 | 17 | bool read(quan::three_d::vect<quan::magnetic_flux_density::uT> & v)const; |
skyscraper | 8:c5dc1ce10722 | 18 | |
skyscraper | 8:c5dc1ce10722 | 19 | bool start_measurement()const; |
skyscraper | 8:c5dc1ce10722 | 20 | |
skyscraper | 8:c5dc1ce10722 | 21 | private: |
skyscraper | 2:9ffb2f18756b | 22 | |
skyscraper | 8:c5dc1ce10722 | 23 | friend bool mag_init(); |
skyscraper | 8:c5dc1ce10722 | 24 | |
skyscraper | 8:c5dc1ce10722 | 25 | bool make_measurement( |
skyscraper | 8:c5dc1ce10722 | 26 | quan::three_d::vect< |
skyscraper | 8:c5dc1ce10722 | 27 | quan::magnetic_flux_density::uT |
skyscraper | 8:c5dc1ce10722 | 28 | >& result |
skyscraper | 8:c5dc1ce10722 | 29 | )const; |
skyscraper | 8:c5dc1ce10722 | 30 | // bool write_reg(uint8_t idx, uint8_t val)const; |
skyscraper | 8:c5dc1ce10722 | 31 | bool set_reg_idx(uint8_t idx_in)const; |
skyscraper | 8:c5dc1ce10722 | 32 | |
skyscraper | 8:c5dc1ce10722 | 33 | // 00 Configuration Register A R/W |
skyscraper | 8:c5dc1ce10722 | 34 | static constexpr char cfg_regA = 0; |
skyscraper | 8:c5dc1ce10722 | 35 | |
skyscraper | 8:c5dc1ce10722 | 36 | //01 Configuration Register B R/W |
skyscraper | 8:c5dc1ce10722 | 37 | static constexpr char cfg_regB = 1; |
skyscraper | 8:c5dc1ce10722 | 38 | |
skyscraper | 8:c5dc1ce10722 | 39 | //02 Mode Register R/W |
skyscraper | 8:c5dc1ce10722 | 40 | static constexpr char mode_reg = 2; |
skyscraper | 8:c5dc1ce10722 | 41 | |
skyscraper | 8:c5dc1ce10722 | 42 | //03 Data Output X MSB Register R |
skyscraper | 8:c5dc1ce10722 | 43 | static constexpr char dout_reg = 3; |
skyscraper | 8:c5dc1ce10722 | 44 | //04 Data Output X LSB Register R |
skyscraper | 8:c5dc1ce10722 | 45 | //05 Data Output Z MSB Register R |
skyscraper | 8:c5dc1ce10722 | 46 | //06 Data Output Z LSB Register R |
skyscraper | 8:c5dc1ce10722 | 47 | //07 Data Output Y MSB Register R |
skyscraper | 8:c5dc1ce10722 | 48 | //08 Data Output Y LSB Register R |
skyscraper | 8:c5dc1ce10722 | 49 | |
skyscraper | 8:c5dc1ce10722 | 50 | // 09 Status Register R |
skyscraper | 8:c5dc1ce10722 | 51 | static constexpr char status_reg = 9; |
skyscraper | 8:c5dc1ce10722 | 52 | |
skyscraper | 8:c5dc1ce10722 | 53 | // 10 Identification Register A R |
skyscraper | 8:c5dc1ce10722 | 54 | static constexpr char id_regA = 10; |
skyscraper | 8:c5dc1ce10722 | 55 | // 11 Identification Register B R |
skyscraper | 8:c5dc1ce10722 | 56 | // 12 Identification Register C R |
skyscraper | 8:c5dc1ce10722 | 57 | |
skyscraper | 8:c5dc1ce10722 | 58 | bool write_reg(uint8_t idx, uint8_t val)const; |
skyscraper | 8:c5dc1ce10722 | 59 | bool get_reg(uint8_t idx_in, uint8_t& result)const; |
skyscraper | 8:c5dc1ce10722 | 60 | bool modify_reg(uint8_t idx, uint8_t and_val, uint8_t or_val)const; |
skyscraper | 8:c5dc1ce10722 | 61 | bool data_locked()const; |
skyscraper | 8:c5dc1ce10722 | 62 | bool set_continuous_measurement_mode()const; |
skyscraper | 8:c5dc1ce10722 | 63 | bool set_gain( quan::three_d::vect<double> const & gain); |
skyscraper | 8:c5dc1ce10722 | 64 | bool set_offset(quan::three_d::vect< |
skyscraper | 8:c5dc1ce10722 | 65 | quan::magnetic_flux_density::uT |
skyscraper | 8:c5dc1ce10722 | 66 | > const & offset); |
skyscraper | 8:c5dc1ce10722 | 67 | |
skyscraper | 8:c5dc1ce10722 | 68 | bool set_idle_mode()const; |
skyscraper | 8:c5dc1ce10722 | 69 | |
skyscraper | 8:c5dc1ce10722 | 70 | // 1,2,4,8 available |
skyscraper | 8:c5dc1ce10722 | 71 | bool set_samples_average(int n_samples)const; |
skyscraper | 8:c5dc1ce10722 | 72 | |
skyscraper | 8:c5dc1ce10722 | 73 | // may change so that always one-shot |
skyscraper | 8:c5dc1ce10722 | 74 | // ignore continousos mode |
skyscraper | 8:c5dc1ce10722 | 75 | //data rate 0.75, 1.5, 3 ,7.5, 15 (Default) , 30, 75 |
skyscraper | 8:c5dc1ce10722 | 76 | template <int N, int D=1> |
skyscraper | 8:c5dc1ce10722 | 77 | bool set_data_rate()const; |
skyscraper | 8:c5dc1ce10722 | 78 | |
skyscraper | 8:c5dc1ce10722 | 79 | bool set_positive_bias()const; |
skyscraper | 8:c5dc1ce10722 | 80 | bool set_negative_bias()const; |
skyscraper | 8:c5dc1ce10722 | 81 | bool mag_clear_bias()const; |
skyscraper | 8:c5dc1ce10722 | 82 | bool set_range(quan::magnetic_flux_density::uT const & range_in); |
skyscraper | 8:c5dc1ce10722 | 83 | |
skyscraper | 8:c5dc1ce10722 | 84 | quan::magnetic_flux_density::uT |
skyscraper | 8:c5dc1ce10722 | 85 | get_flux_density_range()const; |
skyscraper | 8:c5dc1ce10722 | 86 | //------------ |
skyscraper | 8:c5dc1ce10722 | 87 | // per lsb defualt resolution |
skyscraper | 8:c5dc1ce10722 | 88 | quan::magnetic_flux_density::uT mag_resolution; |
skyscraper | 8:c5dc1ce10722 | 89 | // range before saturation |
skyscraper | 8:c5dc1ce10722 | 90 | quan::magnetic_flux_density::uT mag_range; |
skyscraper | 8:c5dc1ce10722 | 91 | quan::three_d::vect<double> mag_gain; |
skyscraper | 8:c5dc1ce10722 | 92 | quan::three_d::vect<quan::magnetic_flux_density::uT> mag_offset; |
skyscraper | 8:c5dc1ce10722 | 93 | }; |
skyscraper | 2:9ffb2f18756b | 94 | |
skyscraper | 2:9ffb2f18756b | 95 | |
skyscraper | 8:c5dc1ce10722 | 96 | |
skyscraper | 2:9ffb2f18756b | 97 | |
skyscraper | 2:9ffb2f18756b | 98 | |
skyscraper | 8:c5dc1ce10722 | 99 | #endif |