Resit Target Localisation Ciaran Kane 18689005

Dependencies:   mbed

Committer:
ciarankane123
Date:
Thu Aug 25 13:50:39 2022 +0000
Revision:
7:acf82069b794
Final Code;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ciarankane123 7:acf82069b794 1 /*
ciarankane123 7:acf82069b794 2 * Mbed library program
ciarankane123 7:acf82069b794 3 * Control Piezo Transducer
ciarankane123 7:acf82069b794 4 *
ciarankane123 7:acf82069b794 5 * Copyright (c) 2018 Kenji Arai / JH1PJL
ciarankane123 7:acf82069b794 6 * http://www.page.sannet.ne.jp/kenjia/index.html
ciarankane123 7:acf82069b794 7 * http://mbed.org/users/kenjiArai/
ciarankane123 7:acf82069b794 8 * Created: Feburary 28th, 2018
ciarankane123 7:acf82069b794 9 * Revised: March 3rd, 2018
ciarankane123 7:acf82069b794 10 */
ciarankane123 7:acf82069b794 11
ciarankane123 7:acf82069b794 12 #include "mbed.h"
ciarankane123 7:acf82069b794 13 #include "piezo_bz.h"
ciarankane123 7:acf82069b794 14
ciarankane123 7:acf82069b794 15 PIEZO_BZ::PIEZO_BZ(PinName pin, uint32_t f, uint32_t on_off_time)
ciarankane123 7:acf82069b794 16 : _pin(pin)
ciarankane123 7:acf82069b794 17 {
ciarankane123 7:acf82069b794 18 out = false;
ciarankane123 7:acf82069b794 19 _pin.write(0);
ciarankane123 7:acf82069b794 20 freq = f;
ciarankane123 7:acf82069b794 21 if (freq < 50) {
ciarankane123 7:acf82069b794 22 freq = 50;
ciarankane123 7:acf82069b794 23 } else if (freq > 10000) {
ciarankane123 7:acf82069b794 24 freq = 10000;
ciarankane123 7:acf82069b794 25 }
ciarankane123 7:acf82069b794 26 flag_run = false;
ciarankane123 7:acf82069b794 27 _t0.attach_us(callback(this, &PIEZO_BZ::create_freq_irq), 500000 / freq);
ciarankane123 7:acf82069b794 28 t_onoff = on_off_time;
ciarankane123 7:acf82069b794 29 if (t_onoff == 0) {
ciarankane123 7:acf82069b794 30 flag_continuous = true;
ciarankane123 7:acf82069b794 31 _t1.attach_us(
ciarankane123 7:acf82069b794 32 callback(this, &PIEZO_BZ::create_onoff_irq),
ciarankane123 7:acf82069b794 33 1000000000 // 1000sec
ciarankane123 7:acf82069b794 34 );
ciarankane123 7:acf82069b794 35 } else {
ciarankane123 7:acf82069b794 36 flag_continuous = false;
ciarankane123 7:acf82069b794 37 _t1.attach_us(
ciarankane123 7:acf82069b794 38 callback(this, &PIEZO_BZ::create_onoff_irq),
ciarankane123 7:acf82069b794 39 t_onoff * 1000
ciarankane123 7:acf82069b794 40 );
ciarankane123 7:acf82069b794 41 }
ciarankane123 7:acf82069b794 42 }
ciarankane123 7:acf82069b794 43
ciarankane123 7:acf82069b794 44 PIEZO_BZ::~PIEZO_BZ()
ciarankane123 7:acf82069b794 45 {
ciarankane123 7:acf82069b794 46 _t0.detach();
ciarankane123 7:acf82069b794 47 _t1.detach();
ciarankane123 7:acf82069b794 48 }
ciarankane123 7:acf82069b794 49
ciarankane123 7:acf82069b794 50 void PIEZO_BZ::start()
ciarankane123 7:acf82069b794 51 {
ciarankane123 7:acf82069b794 52 flag_run = true;
ciarankane123 7:acf82069b794 53 }
ciarankane123 7:acf82069b794 54
ciarankane123 7:acf82069b794 55 void PIEZO_BZ::stop()
ciarankane123 7:acf82069b794 56 {
ciarankane123 7:acf82069b794 57 flag_run = false;
ciarankane123 7:acf82069b794 58 }
ciarankane123 7:acf82069b794 59
ciarankane123 7:acf82069b794 60 void PIEZO_BZ::change_frequency(uint32_t f)
ciarankane123 7:acf82069b794 61 {
ciarankane123 7:acf82069b794 62 _t0.detach();
ciarankane123 7:acf82069b794 63 freq = f;
ciarankane123 7:acf82069b794 64 if (freq < 300) {
ciarankane123 7:acf82069b794 65 freq = 300;
ciarankane123 7:acf82069b794 66 } else if (freq > 10000) {
ciarankane123 7:acf82069b794 67 freq = 10000;
ciarankane123 7:acf82069b794 68 }
ciarankane123 7:acf82069b794 69 _t0.attach_us(callback(this, &PIEZO_BZ::create_freq_irq), 500000 / freq);
ciarankane123 7:acf82069b794 70 }
ciarankane123 7:acf82069b794 71
ciarankane123 7:acf82069b794 72 void PIEZO_BZ::change_on_off(uint32_t on_off_time)
ciarankane123 7:acf82069b794 73 {
ciarankane123 7:acf82069b794 74 _t1.detach();
ciarankane123 7:acf82069b794 75 t_onoff = on_off_time;
ciarankane123 7:acf82069b794 76 if (t_onoff == 0) {
ciarankane123 7:acf82069b794 77 flag_continuous = true;
ciarankane123 7:acf82069b794 78 _t1.attach_us(
ciarankane123 7:acf82069b794 79 callback(this, &PIEZO_BZ::create_onoff_irq),
ciarankane123 7:acf82069b794 80 1000000000U // 1000sec
ciarankane123 7:acf82069b794 81 );
ciarankane123 7:acf82069b794 82 } else {
ciarankane123 7:acf82069b794 83 flag_continuous = false;
ciarankane123 7:acf82069b794 84 _t1.attach_us(
ciarankane123 7:acf82069b794 85 callback(this, &PIEZO_BZ::create_onoff_irq),
ciarankane123 7:acf82069b794 86 t_onoff * 1000U
ciarankane123 7:acf82069b794 87 );
ciarankane123 7:acf82069b794 88 }
ciarankane123 7:acf82069b794 89 }
ciarankane123 7:acf82069b794 90
ciarankane123 7:acf82069b794 91 void PIEZO_BZ::create_freq_irq(void)
ciarankane123 7:acf82069b794 92 {
ciarankane123 7:acf82069b794 93 // <point A>
ciarankane123 7:acf82069b794 94 if (!flag_run) {
ciarankane123 7:acf82069b794 95 _pin.write(0);
ciarankane123 7:acf82069b794 96 return;
ciarankane123 7:acf82069b794 97 }
ciarankane123 7:acf82069b794 98 if (!flag_continuous) {
ciarankane123 7:acf82069b794 99 if (!flag_onoff) {
ciarankane123 7:acf82069b794 100 _pin.write(0);
ciarankane123 7:acf82069b794 101 return;
ciarankane123 7:acf82069b794 102 }
ciarankane123 7:acf82069b794 103 }
ciarankane123 7:acf82069b794 104 _pin.write(out);
ciarankane123 7:acf82069b794 105 out = !out;
ciarankane123 7:acf82069b794 106 // <point B>
ciarankane123 7:acf82069b794 107 // Processing time from <point A> to <point B> is 200 to 230ns
ciarankane123 7:acf82069b794 108 // measured on Nucleo-F446RE board (System clock 180MHz)
ciarankane123 7:acf82069b794 109 }
ciarankane123 7:acf82069b794 110
ciarankane123 7:acf82069b794 111 void PIEZO_BZ::create_onoff_irq(void)
ciarankane123 7:acf82069b794 112 {
ciarankane123 7:acf82069b794 113 // <point C>
ciarankane123 7:acf82069b794 114 if (flag_continuous) {
ciarankane123 7:acf82069b794 115 flag_onoff = true;
ciarankane123 7:acf82069b794 116 } else {
ciarankane123 7:acf82069b794 117 flag_onoff = !flag_onoff;
ciarankane123 7:acf82069b794 118 }
ciarankane123 7:acf82069b794 119 // <point D>
ciarankane123 7:acf82069b794 120 // Processing time from <point C> to <point D> is 120 to 140ns
ciarankane123 7:acf82069b794 121 // measured on Nucleo-F446RE board (System clock 180MHz)
ciarankane123 7:acf82069b794 122 }