I am receiving an FSK signal to a microcontroller and I need to demodulate this signal.
The signal I am receiving is similar to the orange one depicted in my figure but it is a sine wave not a square wave. View attachment 68637
I need to convert this signal to zeros and ones. I know a basic method that measures the period using a zero crossing comparator and then calculate the frequency. That's fine.
I know that the high frequency is 15Khz and low frequency is 10khz and data rate is 1KHZ. My question is when should I sample the signal?
A clear answer is every 1ms. I can use a timer and for every 1ms I have to measure the period. but what if the timer has an error, let's say +-1us, then after 1000 bits, I may have an error. My timer (clock) may have an accumulated error and I might read faster or slower than it should be?
I am using an AVR Atmega8 and this micro has a compare function and an interrupt-on-change.
The frequency of the micro clock is 1MHZ.
But I did not understand what to do with them. Do you suggest to reset the timer (clock) when there is a change from 1 to 0 or from 0 to 1. What if there is a big chain of zeros or ones.
Carefully read the datasheet for your particular micro. It will explain the operation of the capture/compare and interrupt functions. Then look for code examples relating to those functions on the web.
I know what the capture/compare and interrupt functions are.
But what is the answer for my question. When should I sample the signal to measure the period. If I use a timer to measure the period every 1ms, after a while (1000 samples), the timer has errors and it may read values faster or slower than it should be, right? Is my question clear.
I know what the capture/compare and interrupt functions are.
But what is the answer for my question. When should I sample the signal to measure the period. If I use a timer to measure the period every 1ms, after a while (1000 samples), the timer has errors and it may read values faster or slower than it should be, right? Is my question clear.
Use the interrupt-on-change function to detect successive zero-crossings. In the interrupt handler note the count of a counter clocked at 1MHz and determine the difference between that count and a previous count. The difference has a resolution of 1us.