Hello all, I'm trying to measure the duty percentage of a PWM signal in the range of 200Hz-2KHz. I configured 2 timer channels in the following way: /*. Quad Timer A0 configuration ---------------------------- Count mode: Edge of 2nd source triggers primary count till compare Primary count source: Prescaler (IP BUS clock divide by 128) Secondary count source: Counter #0 input pin Input polarity: True polarity Output polarity: True polarity Input capture mode: Load the capture register on falling edge of input Output capture mode: Asserted while counter is active Count once: Count until compare and stop Count direction: Count up Coinit disabled, Master mode disabled, Output disabled Interrupts: None /*. Quad Timer A1 configuration ---------------------------- Count mode: Edge of 2nd source triggers primary count till compare Primary count source: Prescaler (IP BUS clock divide by 128) Secondary count source: Counter #0 input pin Input polarity: Inverted polarity Output polarity: True polarity Input capture mode: Load the capture register on falling edge of input Output capture mode: Asserted while counter is active Count once: Count until compare and stop Count direction: Count up Coinit disabled, Master mode disabled, Output disabled Interrupts: None This way A0 should count the time from the rising to the falling edge, and A1 counts from falling to rising - it seemed very easy. Now I have 2 problems: The capture register contains very often false values or zero although IEF bit is set; I can't measure the signal reliably. (It's not a matter of the signal quality, it is very nice shaped) Other problem is that I'd like to let this measurement run in the background. But the timer module doesn't work as described in the User's Manual: 14.6.7 Triggered-Count Mode ...Odd edges restart the counting. ... Actually, counting isn't restarted, only continued if anoter edge occurs. After a capture occurs I have to set the IEF bit manually, and this way it's very uncomfortable. Does anyone have an idea how to do this better? Best wishes, Georg Bende Softwareentwickler Abteilung Elektronik Dr. Fritz Faulhaber GmbH & Co KG Daimlerstr. 23 71101 Schaich Tel: +49 7031 638294 |
|
Measuring PWM with DSP56F80x
Started by ●August 26, 2003
Reply by ●August 27, 20032003-08-27
Hi Georg, A couple thoughts on the subject. The User Manual on the QuadTimers is the worst of all the chapters on giving useful information. You say below that you "set the IEF bit", just make sure you are Clearing this bit to re-enable a capture. I use the interrupt to read the capture reg and clear the IEF flag but you could just do that after reading and then clearing the capture reg in the background. To initialize the counter after the capture you could set up another timer, say A2, as a Master with a very short count and set your counters Co-Channel Init bit, Co Init, to do this for you. However, I am not sure if the Init will clear the Capture register or not (the manual does not give any good info on this and I could not get it out of Tech Support either). Pete --- In , "Bende Georg" <georg.bende@f...> wrote: > Hello all, > > I'm trying to measure the duty percentage of a PWM signal in the range of 200Hz-2KHz. > I configured 2 timer channels in the following way: > > /*. > Quad Timer A0 configuration > ---------------------------- > Count mode: Edge of 2nd source triggers primary count till compare > Primary count source: Prescaler (IP BUS clock divide by 128) > Secondary count source: Counter #0 input pin > Input polarity: True polarity > Output polarity: True polarity > Input capture mode: Load the capture register on falling edge of input > Output capture mode: Asserted while counter is active > Count once: Count until compare and stop > Count direction: Count up > Coinit disabled, Master mode disabled, Output disabled > Interrupts: None > > /*. > Quad Timer A1 configuration > ---------------------------- > Count mode: Edge of 2nd source triggers primary count till compare > Primary count source: Prescaler (IP BUS clock divide by 128) > Secondary count source: Counter #0 input pin > Input polarity: Inverted polarity > Output polarity: True polarity > Input capture mode: Load the capture register on falling edge of input > Output capture mode: Asserted while counter is active > Count once: Count until compare and stop > Count direction: Count up > Coinit disabled, Master mode disabled, Output disabled > Interrupts: None > > This way A0 should count the time from the rising to the falling edge, and A1 counts from falling to rising - it seemed very easy. > Now I have 2 problems: > The capture register contains very often false values or zero although IEF bit is set; I can't measure the signal reliably. (It's not a matter of the signal quality, it is very nice shaped) > Other problem is that I'd like to let this measurement run in the background. But the timer module doesn't work as described in the User's Manual: > 14.6.7 Triggered-Count Mode ...Odd edges restart the counting. ... > Actually, counting isn't restarted, only continued if anoter edge occurs. After a capture occurs I have to set the IEF bit manually, and this way it's very uncomfortable. > Does anyone have an idea how to do this better? > > Best wishes, > Georg Bende > Softwareentwickler > Abteilung Elektronik > Dr. Fritz Faulhaber GmbH & Co KG > Daimlerstr. 23 > 71101 Schaich > Tel: +49 7031 638294 |
Reply by ●August 27, 20032003-08-27
You should set the Count Once = 0 which keeps counter non-stop running. So that you can capture the edge of the pulse. If you try to capture the pulse width, you should use Gated-Count Mode. C.W. --- Bende Georg <> wrote: > Hello all, > > I'm trying to measure the duty percentage of a PWM > signal in the range of 200Hz-2KHz. > I configured 2 timer channels in the following way: > > /*. > Quad Timer A0 configuration > ---------------------------- > Count mode: Edge of 2nd source triggers primary > count till compare > Primary count source: Prescaler (IP BUS clock > divide by 128) > Secondary count source: Counter #0 input pin > Input polarity: True polarity > Output polarity: True polarity > Input capture mode: Load the capture register on > falling edge of input > Output capture mode: Asserted while counter is > active > Count once: Count until compare and stop > Count direction: Count up > Coinit disabled, Master mode disabled, Output > disabled > Interrupts: None > > /*. > Quad Timer A1 configuration > ---------------------------- > Count mode: Edge of 2nd source triggers primary > count till compare > Primary count source: Prescaler (IP BUS clock > divide by 128) > Secondary count source: Counter #0 input pin > Input polarity: Inverted polarity > Output polarity: True polarity > Input capture mode: Load the capture register on > falling edge of input > Output capture mode: Asserted while counter is > active > Count once: Count until compare and stop > Count direction: Count up > Coinit disabled, Master mode disabled, Output > disabled > Interrupts: None > > This way A0 should count the time from the rising to > the falling edge, and A1 counts from falling to > rising - it seemed very easy. > Now I have 2 problems: > The capture register contains very often false > values or zero although IEF bit is set; I can't > measure the signal reliably. (It's not a matter of > the signal quality, it is very nice shaped) > Other problem is that I'd like to let this > measurement run in the background. But the timer > module doesn't work as described in the User's > Manual: > 14.6.7 Triggered-Count Mode ...Odd edges restart the > counting. ... > Actually, counting isn't restarted, only continued > if anoter edge occurs. After a capture occurs I have > to set the IEF bit manually, and this way it's very > uncomfortable. > Does anyone have an idea how to do this better? > > Best wishes, > Georg Bende > Softwareentwickler > Abteilung Elektronik > Dr. Fritz Faulhaber GmbH & Co KG > Daimlerstr. 23 > 71101 Schaich > Tel: +49 7031 638294 > __________________________________ |