CODIGOS BASE PARA DESARROLLO DEL MAGNETO
Generador Base Burst
byte val;
void setup() {
DDRD |= _BV (7); // pinMode (7, OUTPUT);
val = TIMSK0;
}
void loop() {
TIMSK0 = 0; // deshabilita timer0
for (int i = 0; i < 60; i++) { // Cantidad de pulsos exactos en ráfaga si se usa PORTD &= ~_BV (7);
// Si se usa solo PIND |= _BV (7); el valor es el doble
PORTD &= ~_BV (7); // digitalWrite (7, LOW);
__builtin_avr_delay_cycles (10); // Tiempo en "0" de pulsos del burst
PORTD |= _BV (7); // digitalWrite (7, HIGH);
__builtin_avr_delay_cycles (30); // Tiempo en "1" de pulsos del burst
//PIND |= _BV (7); // digitalWrite (7, TOGGLE); -> 50% duty cycle. USARLO SOLO
}
__builtin_avr_delay_cycles (400000); // para 16MHz CPU -> 160 ciclos = 10µs (400.000=25ms, 40Hz)
//TIMSK0 = val; // habilita timer0
}
/* ---------------------------------------------------------------------------------------------------------------------------------------------------*/
40Hz con Timer Arduino
/* T= 49999 (ICR1)
|<--------------------->|
---- ----
| | | |
____| |_____________________| |_____________
--->| |<---- t=100us (OCR1A)
PIN 9 -> SALIDA
*/
//#include <Arduino.h>
void setup() {
DDRB |= ( 1 << PB1 ); // PIN 9 salida. pinMode (9, OUTPUT);
TCNT1 = 0; // Reiniciamos el contador inicial (por siacaso)
ICR1 = 49999; // T de la señal (el TOP de nuestra PWM). 49999 -> T=25ms f=40Hz
TCCR1A = (1 << COM1A1) | (0 << COM1A0); // Ponemos a 'bajo' el OCR1A cuando coincida el Compare Match
TCCR1A |= (1 << WGM11) | (0 << WGM10 ); // Fast PWM: TOP: ICR1
TCCR1B = (1 << WGM13) | (1 << WGM12 ); // Fast PWM: TOP: ICR1
TCCR1B |= (0 << CS12) | (1 << CS11) | ( 0 << CS10 ); // Preesc = 8
OCR1A = 200; // Duracion del pulso 100 us. Minimo = 1us
}
void loop() {
TCNT2 = OCR2B - 1; // Ponemos el contador justo antes del OCR2B
//delay(100);
}
Para 5 Hz
/* T= 49999 (ICR1)= 200 ms = 5Hz
|<---------------->|
----------- -----------
| | | | duty cycle 50%
____| |______| |_____________
--->| |<---- t=25000us (OCR1A)
PIN 9 -> SALIDA
*/
//#include <Arduino.h>
void setup() {
DDRB |= ( 1 << PB1 ); // PIN 9 salida. pinMode (9, OUTPUT);
TCNT1 = 0; // Reiniciamos el contador inicial (por siacaso)
ICR1 = 49999; // T de la señal (el TOP de nuestra PWM). 49999 -> T=200ms f=40Hz
TCCR1A = (1 << COM1A1) | (0 << COM1A0); // Ponemos a 'bajo' el OCR1A cuando coincida el Compare
Match
TCCR1A |= (1 << WGM11) | (0 << WGM10 ); // Fast PWM: TOP: ICR1
TCCR1B = (1 << WGM13) | (1 << WGM12 ); // Fast PWM: TOP: ICR1
TCCR1B |= (0 << CS12) | (1 << CS11) | ( 1 << CS10 ); // Preesc = 64
OCR1A = 25000; // Duracion del pulso 25000 us. Minimo = 1us
}
void loop() {
TCNT2 = OCR2B - 1; // Ponemos el contador justo antes del OCR2B
//delay(100);
}
/* ---------------------------------------------------------------------------------------------------------------------------------------------------*/
Timer 2 – Para 2 salidas
//DECLARACION DE VARIABLES GLOBALES
volatile unsigned long ticks;
unsigned long Tarea1;
unsigned long Tarea2;
//* ----------------------------------------------------------------------------------------------------
void setup(){
DDRB = _BV(PB5); // Pin 13 Arduino UNO equivale a PB5
DDRD = _BV(PD3); // Pin 3 Arduino UNO equivale a PD1 - //pinMode (3, OUTPUT);//
// NORMAL MODE
TCCR2A = (1 << COM2A1) | (0 << COM2A0) | (0 << COM2B1) | (0 << COM2B0) | (0 << 3) | (0 << 2) | (0 << WGM21) |
(0 << WGM20);
TCCR2B = (0 << FOC2A ) | (0 << FOC2B ) | (0 << 5) | (0 << 4) | (0 << WGM22) | (1 << CS22) | (0 << CS21) | (0 <<
CS20);
// Configurado a 1.024 ms
// Activo Timer2 Overflow Interrupt
TIMSK2 = (0 << 7) | (0 << 6) | (0 << 5) | (0 << 4) | (0 << 3) | (0 << OCIE2B) | (0 << OCIE2A) | (1 << TOIE2);
// Oscilador interno
ASSR = (0 << 7) | (0 << EXCLK) | (0 << AS2) | (0 << TCN2UB) | (0 << OCR2AUB) | (0 << OCR2BUB) | (0 << TCR2AUB) |
(0 << TCR2BUB);
// Inicializo variables
Tarea1 = 10;
Tarea2 = 25;
// Activo interrupciones globales.
sei();
}
//* -----------------------------------------------------------------------------------------------------------
void loop() {
if (ticks >= Tarea1){
PINB |= _BV(PB5); //Conmuto pin 13
Tarea1 += 10; //Configuro para que se ejecute de nuevo la Tarea1 dentro de 10 ticks
}
if (ticks >= Tarea2){
PIND |= _BV(PD3); //Conmuto pin 2 - se REEMPLAZA POR
Tarea2 += 25; //Configuro para que se ejecute de nuevo la Tarea2 dentro de 25 ticks
}
}
//-----------------------------------------------------
// Rutina de Interrupcion [TIMER2_OVF_vect es la rutina que se ejecuta cuando el Timer2 ->Overflow]
// Arduino tiene un cristal de 16 Mhz
// Por lo que tenemos una interrupcion cada => 1/ ((16000000 / PRESCALER) / 256)
ISR(TIMER2_OVF_vect){
ticks++;
}
/* ---------------------------------------------------------------------------------------------------------------------------------------------------*/