Como Generar una señal a mi gusto en un pic

Buenas a todos lo que pasa es que me pidieron generar la señal que esta en la imagen pues ya pude generarla pero el problema es la frecuencia que me piden en el proyecto ya he intentado todo voy a dejar el código y la imagen de la señal que deseo

PTD:la frecuencia que me piden es 5khz y me sale una frecuencia de 20hz lo hago atravez de timer 0

Código:
#include <18f4550.h>
#device adc=10
#fuses hspll,mclr,nowdt,noprotect,nolvp,nodebug,usbdiv,pll4,cpudiv1,novregen,nopbaden
#use delay (clock=48000000)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)


int16 frecuencia=0;
int16 desbordes=0;
int seno[]={0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
255,
0};
#int_rtcc
void rtcc_isr(){
        
        frecuencia=read_adc();        
        output_B(seno[desbordes]);
        set_rtcc(240); 
        desbordes++;
        if(desbordes>=511)
        
        
                     {
                          desbordes = 0;
                        }   
  }

void main()
  {
     setup_adc_ports(all_analog);
     setup_adc(adc_clock_internal);
     set_adc_channel(0);  
     set_tris_b(0x00);
     set_tris_d(0x00);
     setup_counters(rtcc_internal, rtcc_div_16|rtcc_8_bit);      
     enable_interrupts(int_rtcc);       
     enable_interrupts(global);
     set_rtcc(252);
     desbordes = 0;

   while(true)
   {
   
   }
   } ...
 
Puedes usar el modulo PWM del micro, junto aun filtro pasabajos. Yo pude generar señales de frecuencia de 10Khz utilizando valores predetermiandos guardados en un vector, eso si, no pueden ser muchos datos, porque el PIC tarda mucho entre punto y punto de la señal; y no puede generar frecuencias mas altas.
 
Hola, fijate si te sirve la idea, soy neofito y quizá este errado en el concepto, si es así mis disculpas.
Con un poco de matemática y paciencia se puede, claro que no será una pendiente perfecta, pero eso depende de si te sirve la precición. Considerando una pendiente de 0 a 5V en 1/2 T, estamos hablando de T igual para ambos estados, podemos dividir 1/2T en x partes= yT, o 5V en X partes=yV. Con ese calculo deberemos definir el incremento en la referencia del pwm de salida para partiendo de 0 llegar a 5V en el tiempo elegido (y según sea 10 u 8 bits la referencia)
Iniciando con el calculo del tiempo intermedio a los incrementos, cada yT se incrementa PWM hasta los 5V, se mantiene en ese valor 1/2T y se vuelve a comenzar.
T se puede ingresar por A/D o teclado y en forma de tiempo o frecuencia, y su refresco cada temporización o mando externo.
Un abrazo
 
Atrás
Arriba