Hi all!!
How to generate variable frequency in lpc11xx controller, currently i'm getting fixed frequency on pin 27[CT16B0_MAT0] of 96.2hz, but I need to generate freq from 6hz to 20hz.
Below is the part of the code which I have compared:
void init_timer16(uint8_t timer_num, uint32_t TimerInterval) { if ( timer_num == 0 ) { LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7); LPC_IOCON->PIO0_2 &= ~0x07; /* Timer0_16 I/O config */ LPC_IOCON->PIO0_2 |= 0x02; /* Timer0_16 CAP0 */ LPC_IOCON->PIO0_8 &= ~0x07; LPC_IOCON->PIO0_8 |= 0x02; /* Timer0_16 MAT0 */ LPC_IOCON->PIO0_9 &= ~0x07; LPC_IOCON->PIO0_9 |= 0x02; /* Timer0_16 MAT1 */ #ifdef __JTAG_DISABLED LPC_IOCON->JTAG_TCK_PIO0_10 &= ~0x07; LPC_IOCON->JTAG_TCK_PIO0_10 |= 0x03; /* Timer0_16 MAT2 */ #endif timer16_0_counter = 0; LPC_TMR16B0->MR0 = TimerInterval; LPC_TMR16B0->MCR = 3; /* Interrupt and Reset on MR0 */ /* Enable the TIMER0 Interrupt */ NVIC_EnableIRQ(TIMER_16_0_IRQn); } else if ( timer_num == 1 ) { LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); LPC_IOCON->PIO1_8 &= ~0x07; /* Timer1_16 I/O config */ LPC_IOCON->PIO1_8 |= 0x01; /* Timer1_16 CAP0 */ LPC_IOCON->PIO1_9 &= ~0x07; LPC_IOCON->PIO1_9 |= 0x01; /* Timer1_16 MAT0 */ LPC_IOCON->PIO1_10 &= ~0x07; LPC_IOCON->PIO1_10 |= 0x02; /* Timer1_16 MAT1 */ timer16_1_counter = 0; LPC_TMR16B1->MR0 = TimerInterval; LPC_TMR16B1->MCR = 3; /* Interrupt and Reset on MR1 */ /* Enable the TIMER1 Interrupt */ NVIC_EnableIRQ(TIMER_16_1_IRQn); } return; }
Kindly suggest how to process further.
Thank you.
Ok sir. For example in MAT0 & MAT1 register I should generate 9.6hz & 14.1hz respectively. So it seems different frequencies for MAT register using 16/32 bit timer with 50% duty cycle[square waves]
Maybe you should explain how you plan to get two frequencies out of the same timer.
Remember that you use one match register to reset the timer. This match register will decide the frequency of the reset of the timer. And it will also decide the frequency that the timer may match any of the other match registers for the same timer.
Let's say the timer ticks once every us.
Let's say you use one match register to restart the timer after 10000 ticks (10000-1 means at the value 9999). That would then be 10000us or 10ms.
Let's say that you also use this match to produce a match event - then you get one match event ever 10ms. If that events toggles a pin, you get a 20ms period or 50Hz.
Now let's say you take a couple of other match registers and set at arbitrary values no larger than 10000 ticks (which you can't pass since you always reset after 10000 ticks).
If one of these matches happens at 2000 ticks it would mean 2ms. But then it's 8ms left until the timer ticks and then 2ms until the timer once more reaches 2000. So this match will also happen every 10ms - same frequency as you restart the timer. The only difference is that you got a timer match with 2ms offset.
In theory, you could have a match on 2500 and one on 7500 and they togeter will represent twice as many matches as the timer is reset - but what you then got is exactly twice the frequency. Not an arbtrary frequency.
You talk about 9.6 Hz and 14.1 Hz. But they aren't a factor two from each other. So you can't get the lower frequency by just making twice as many ticks as the timer reset. The method then would be to let the match registers produce an interrupt - and on every interrupt you reprogram the match registers and let the timer continue to run instead of constantly being reset. This is asy to do, since your two frequencies are so low.
So if 9.6 Hz represents N1 ticks of the timer and 14.1 Hz represents N2 ticks of the timer, then you configure the timer with one match event after N1 ticks and a different match event after N2 ticks. When N1 happens, you reprogram that match register to make the next match after 2*N1 ticks. When the N2 match happens, you reprogram the match register to get the next match after 2*N2 ticks. When you reach the 32-bit limit of the timer, you just overflow, i.e. (x*N1+N1) mod TIMER_RANGE will work well.
Doing this, means a single timer can produce one frequency for every match register - as long as the processor is fast enough to handle the match register interrupts.
Thank you for the detail explanation.Will work on it. Any idea of how to reset & set the tick function for this particular controller.
"Any idea of how to reset & set the tick function for this particular controller."
I don't even understand the question. It's trivial to reset the timer, and you have already posted code that makes use of that function. But since it isn't code you have written, you may not understand what it does. That's why the manufacturer did make an excellent user manual for the processor.