M
Mac
Guest
I'm thinking about doing an ultrasonic FSK data transmission system.
Does anyone have any idea if this would work well? My plan was to use 40
kHz transducers and use FSK with the two frequencies being 40.727 kHz and
39.529 kHz.
(These numbers come from dividing down a 4.032 MHz crystal oscillator by
102 or 99, respectively.)
For the higher frequency, I would use exactly 34 full cycles as one
baud period. For the lower frequency I would use 33 full cycles. This
works out to be exactly the same duration, for those who may be curious.
So I would have, in effect, continuous phase FSK. According to my
communications text book, the minimum frequency shift needs to be 1/2 the
baud rate or the frequency shift cannot be detected reliably. Since my
frequency shift is nearly twice that lower threshold (i.e, the same as
the baud rate), it should be no problem, right?
I would just drive the transducer with a square wave when transmitting.
For decode, I was thinking that I would use a PLL (maybe the LMC568?),
possibly with a pre-amp in front of it. I would use a comparator to
discriminate between ones and zeros. The inverting terminal would have a
highly filtered version of the control voltage, and the non-inverting
terminal would have a less filtered version of the control voltage. If
necessary, I could restrict the data set to ensure a minimum number of
transitions per byte (or whatever). Or I could use zero as a start bit and
one as a stop bit, as in typical RS232, although see below.
One thing I am worried about is that in my application I would only send
one byte at a time, with long silences in between. I have little
experience with PLL's, but I am afraid that the loop would not have
time to lock if I just start transmitting. This might preclude using
standard RS232 timing. One solution to this problem (if it is a problem)
would be to send a pre-amble of several zeros followed by a one as a start
of frame indicator. The decoder would then have to tolerate a potentially
variable and fractional number of zeros at the beginning of each frame (or
byte.)
Does anyone have any comments or suggestions? Am I doing this the hard
way?
Or does anyone have reason to believe that it won't work at all?
Thanks!
--Mac
Does anyone have any idea if this would work well? My plan was to use 40
kHz transducers and use FSK with the two frequencies being 40.727 kHz and
39.529 kHz.
(These numbers come from dividing down a 4.032 MHz crystal oscillator by
102 or 99, respectively.)
For the higher frequency, I would use exactly 34 full cycles as one
baud period. For the lower frequency I would use 33 full cycles. This
works out to be exactly the same duration, for those who may be curious.
So I would have, in effect, continuous phase FSK. According to my
communications text book, the minimum frequency shift needs to be 1/2 the
baud rate or the frequency shift cannot be detected reliably. Since my
frequency shift is nearly twice that lower threshold (i.e, the same as
the baud rate), it should be no problem, right?
I would just drive the transducer with a square wave when transmitting.
For decode, I was thinking that I would use a PLL (maybe the LMC568?),
possibly with a pre-amp in front of it. I would use a comparator to
discriminate between ones and zeros. The inverting terminal would have a
highly filtered version of the control voltage, and the non-inverting
terminal would have a less filtered version of the control voltage. If
necessary, I could restrict the data set to ensure a minimum number of
transitions per byte (or whatever). Or I could use zero as a start bit and
one as a stop bit, as in typical RS232, although see below.
One thing I am worried about is that in my application I would only send
one byte at a time, with long silences in between. I have little
experience with PLL's, but I am afraid that the loop would not have
time to lock if I just start transmitting. This might preclude using
standard RS232 timing. One solution to this problem (if it is a problem)
would be to send a pre-amble of several zeros followed by a one as a start
of frame indicator. The decoder would then have to tolerate a potentially
variable and fractional number of zeros at the beginning of each frame (or
byte.)
Does anyone have any comments or suggestions? Am I doing this the hard
way?
Or does anyone have reason to believe that it won't work at all?
Thanks!
--Mac