View previous topic :: View next topic |
Author |
Message |
rahulbiliye Guest
|
Square wave time period code |
Posted: Tue Jan 01, 2008 12:45 am |
|
|
hi!
can anyone help me to write C-code to find period of a square wave given as input(pin 6 mains sync input)to pic12f683.this is to find out on what frequency i am working i.e 50 or 60Hz and to position the pulse in centre of mains cycle.
i also need to output 10KHz ,15% duty cycle pulses on pin 5 for 1 second after N/8 pulses |
|
|
John P
Joined: 17 Sep 2003 Posts: 331
|
|
Posted: Tue Jan 01, 2008 12:32 pm |
|
|
The frequency determination seems pretty trivial. Just get an interrupt at the same point in each cycle, start a timer and next time you get the interrupt, read the timer and see if it's over a threshold (somewhere between 20msec for 50Hz, 16.67msec for 60Hz).
Getting a known point on the waveform isn't so easy. Can you be certain it's a sine wave, and have you got a reliable way to turn it into a digital signal that the processor can read, or are you reading it as an analog level? You'd have to do something like checking for the rising wave at one side of the peak, start a timer and stop it when the voltage is at the same point on the descending side, then take half the timer value and use it to say "This is where the peak is". But that tells you the peak of a cycle based on the previous cycle. It depends on how accurate you need to be. |
|
|
rahulbiliye Guest
|
square wave time period code |
Posted: Wed Jan 02, 2008 2:05 am |
|
|
Thanks John.. but as i am a new to this PIC microcontroller.i request u to please send the C code to calculate period of input square wave given to pic12f683 and also to output 10Khz, 15%dutycycle pulses |
|
|
John P
Joined: 17 Sep 2003 Posts: 331
|
|
Posted: Thu Jan 03, 2008 11:24 am |
|
|
Sorry, I'm one of those mean people who are happy to discuss general principles of how a program might work to solve a particular problem, but I'm not going to write code to do it. If you've got the processor and the compiler, that's your job. You've started with some simple projects, and that's good. The information you need is all in the manual. |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Fri Jan 04, 2008 9:35 am |
|
|
To make it rock-bottom simple you could just wait for the pin to go high, wait about 18ms and check the pin again. If the line is 60 Hz it will go high again in about 17ms and you will see the pin high. If the line is 50 Hz it won't go high until 20ms so the pin should be low. Once you know which frequency you have, just wait for the start of a cycle and wait 1/2 cycle and you must be at the middle of the cycle.
That is crude but real simple, and it is a place to start. Like John P I don't write code for people. You learn better by working out the minutia yourself. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
gjs_rsdi
Joined: 06 Feb 2006 Posts: 468 Location: Bali
|
50,60hz |
Posted: Sun Jan 06, 2008 4:19 pm |
|
|
if oscillator 8MHz, PC=500ns
timer1 prescaler 1:2
using GP2/pin5 with CCP1 will capture 50hz as 20000us & 60Hz as 16666us. don't forget to set timer1 to zero after the CCP1 interrupt.
using GP1/pin6, you can use interrupt on change with timer1. you will get interrupt on 10000us for 50hz & 8333us for 60hz. in this case, the first interrupt (FE) will give you the sine center, the second he end (RE).don't forget to set timer1 to zero after the interrupt on change.
for the pulse out, is not clear to me what you want to do (N/8 pulses).
you can use the PWM module or just simple timer2 interrupt and the PR register for the pulse high and the period.
or timer2 interrupt
setup_timer_2(T2_DIV_BY_1,100,2); will give you interrupt every 100us/10000hz (1,15,2 for 15% high; 1,85,2 for 85% low)
joseph |
|
|
|