TODOPIC
Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: juanml en 01 de Junio de 2012, 19:01:54
-
Tengo un problema, estoy tratando de implementar un DAC mediante PWM. Estoy usando una tabla con valores de una onda senoidal, pero lo que pasa es que la onda resultante tiene como "saltos". Esto que digo se puede ver mejor en este video:
El código es el siguiente:
unsigned char i = 0;
unsigned char sine[256]={
127,130,133,136,139,143,146,149,152,155,158,161,164,167,170,173,176,178,181,184,187,190,192,195,198,200,203,205,208,210,212,215,217,219,221,223,225,227,229,231,233,234,236,238,239,240,
242,243,244,245,247,248,249,249,250,251,252,252,253,253,253,254,254,254,254,254,254,254,253,253,253,252,252,251,250,249,249,248,247,245,244,243,242,240,239,238,236,234,233,231,229,227,
225,223,221,219,217,215,212,210,208,205,203,200,198,195,192,190,187,184,181,178,176,173,170,167,164,161,158,155,152,149,146,143,139,136,133,130,127,124,121,118,115,111,108,105,102,99,
96,93,90,87,84,81,78,76,73,70,67,64,62,59,56,54,51,49,46,44,42,39,37,35,33,31,29,27,25,23,21,20,18,16,15,14,12,11,10,9,7,6,5,5,4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,
12,14,15,16,18,20,21,23,25,27,29,31,33,35,37,39,42,44,46,49,51,54,56,59,62,64,67,70,73,76,78,81,84,87,90,93,96,99,102,105,108,111,115,118,121,124};
void interrupt VectorNumber_Vtpm1ovf tpm1ovf_isr(void)
{
TPM1SC_TOF = 0;
TPM1C0V=sine[i];
i++;
if (i==256)
{
i=0;
}
}
void main(void)
{
TPM1SC = 0b01101000;
TPM1C0SC = 0b00101000;
TPM1MOD = 0x00FF;
TPM1C0V = sine[i];
EnableInterrupts; // enable interrupts
while (1)
{
}
}
Estoy usando un SH8 con una frecuencia de bus de 8Mhz con el oscilador interno.
Tienen idea cuál puede ser el problema?
-
El if( i==256 ) no tiene sentido. Si declaras i como una variable de 8-bits y además el buffer tiene 256 posiciones, entonces solo debes incrementar i. Después veo que en los extremos colocas varios intervalos repetidos, es por alguna razón?
Saludos!
-
El if( i==256 ) no tiene sentido. Si declaras i como una variable de 8-bits y además el buffer tiene 256 posiciones, entonces solo debes incrementar i. Después veo que en los extremos colocas varios intervalos repetidos, es por alguna razón?
Saludos!
Tenés razón con lo del if! Pasa que primero estaba usando tablas con menos valores entonces si tenía que hacer la comparación.
A que te referís con lo de varios intervalos repetidos?
Gracias por responder!
-
Perdón, era valores repetidos. 254,254,254.... Por ahi cuando creas el vector podes disminuir la amplitud.
-
Probé con vectores de menos puntos y también con amplitudes más chicas, pero sigue pasando lo mismo. Me tiene medio perdido esto.
-
Yo tampoco veo nada que genere ese problema en el código que muestras :tongue:
-
Ya está! Era un problema con el watchdog.
-
Muy buen ejercicio juanml, me podrias explicar tu o RICHI777, como interpreto esa serie numerica ?, como una tabla que se va barriendo en forma concecutiva?y se van cargando en TPM1C0V?
Porque esa serie? como es que con esa serie se logra conformar una señal senoidal? es prueba y error o hay un metodo?
Gracias.
-
Muy buen ejercicio juanml, me podrias explicar tu o RICHI777...
:D
como una tabla que se va barriendo en forma concecutiva?y se van cargando en TPM1C0V?
Si, eso mismo.
Porque esa serie? como es que con esa serie se logra conformar una señal senoidal? es prueba y error o hay un método?
Porque quieres una senoidal. Primero que nada debes entender como es el tema del PWM, que pasa si le aplicas un filtro pasabajos, entonces vas a entender porque esa serie. Luego no es prueba y error, mediante algún programa puedes crear esa tabla en base a una senoidal. Un programa conocido por todos para usar sería el Excel.
Saludos!
-
Bueno debi poner Juanml, RICHI777 y..... Suky
Gracias ;-)
-
Hola, borrame de la lista. Yo no hubiese podido ayudarte.
Saludos !
-
Yo creo que hay mucho craneos por aca, y si es por ser umilde se agradece tambien pero creo que tu perteneces a ese grupo
Salu00010 :-/
-
Hola, gracias por el halago, pero hay muchos temas que no domino, el PWM es uno de ellos.
Saludos !