webgiorgio
Joined: 02 Oct 2009 Posts: 123 Location: Denmark
|
what should one know about multiplications |
Posted: Thu Nov 17, 2011 12:11 pm |
|
|
I have this vector, which represent a sine wave 0-255.
Code: |
long int SINE_WAVE[200] = {
128,132,136,139,143,147,150,154,158,161,165,169,172,176,179,
182,186,189,192,195,199,202,204,207,210,213,215,218,220,223,
225,227,229,231,233,235,237,238,240,241,242,243,244,245,246,
247,247,247,248,248,248,248,248,247,247,247,246,245,244,243,
242,241,240,238,237,235,233,231,229,227,225,223,220,218,215,
213,210,207,204,202,199,195,192,189,186,182,179,176,172,169,
165,161,158,154,150,147,143,139,136,132,128,124,120,117,113,
109,106,102,98,95,91,87,84,80,77,74,70,67,64,61,57,54,52,49,
46,43,41,38,36,33,31,29,27,25,23,21,19,18,16,15,14,13,12,11,
10,9,9,9,8,8,8,8,8,9,9,9,10,11,12,13,14,15,16,18,19,21,23,
25,27,29,31,33,36,38,41,43,46,49,52,54,57,61,64,67,70,74,77,
80,84,87,91,95,98,102,106,109,113,117,120,124};
|
I want to use it as reference to generate a PWM sinewave. The interrupt is at around 200 Hz for now, and the PWM frequency 1 kHz.
Code: | #int_rtcc
void isr() {
set_rtcc(6); // frequency of interrrupt = (clock/(4*divisor))/(256-reload)
// 2029 hz = (20000000/(4*16))/(256-102)
if(++sine_index==200) {
sine_index=0;
}
dc_val=(SINE_WAVE[sine_index])*64;
//dc_val=10*DC*((period>>8)+1); //Ton
sine=(SINE_WAVE[sine_index]);
printf(lcd_putc, "\fdc_val=%LU", sine);
printf(lcd_putc, "\ni=%u",sine_index);
printf(lcd_putc, "\ndc_val=%Lu",dc_val);
set_power_pwm0_duty(dc_val); //16383
//set_power_pwm0_duty(DC * ((period>>8)+1)); //max ADC value is 1023
//max duty cycle is (period+1)*4-1
//basically the same as max_adc * period/256
} |
The problem using int16 for the vector, I consumes A LOT of RAM. I think that the problem is the multiplication *64.
If I leave the vector in int8, the program doesn't work.
How can I do?
I am suppose to generate a three phase 20 Hz sine wave with a 18F4431, for a university assignment. |
|