Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

02/04/2014 #1


Generar una onda de 400 kHz
Hola, me gustaria saber lo primero si me es posible generar una onda (cuadrada) de unos 400 kHz con un arduino UNO, estoy haciendo muchas pruebas con los timers y AVR, pero solo consigo ondas de 90 kHz, tengo bastante claro que hacer, pero no me funciona, y no entiendo por que.

Si alguien me pudiera echar una mano, se lo agradeceria muchisimo.
02/04/2014 #2

Avatar de cosmefulanito04

Podés llegar hasta 1,6MHz si usas un cristal de 16MHz, pero necesitás programar en assembler, los timer no te van a servir. Tal vez no podés generar 400kHz clavados, pero si algo muy cercano.

Acá te dejo un proyecto que puede ayudarte, mirá las rutinas en assembler de la señal TTL:

[Aporte] Generador de Señales (DDS)
02/04/2014 #3


Muchas gracias por tu ayuda, pero no tengo ni idea de ensamblador, intentare buscar alguna solucion, y si no, tendre que ponerme a aprender, jaja.

Muchas gracias por tu ayuda y rapidez
02/04/2014 #4

Avatar de cosmefulanito04

¿Sabés C?

De esa forma te ayudo a compilarlo desde ahí, pero es necesario que sepas usar el AVR studio o el gcc.
02/04/2014 #5


El AVR studio no lo e usado nunca, pero gcc si, y si que se C.

Me mirare tb el AVR studio a ver que tal
02/04/2014 #6

Avatar de cosmefulanito04

Ahora te paso el código con assembler (ni lo tenés que tocar) y como levantarlo en C, pero es necesario que tu cristal sea de 16MHz.
02/04/2014 #7


si, el cristal de mi arduino es de 16MHz, no el de 8
Gracias
02/04/2014 #8
Moderador general

Avatar de Fogonazo

¿ Que uso le darás a esa frecuencia ?
02/04/2014 #9


uffffff, en principio, la quiero para emitir por una antena y recibirla, pero tb me gustaria hacer una modulacion en frecuencia de la onda para transmitir informacion
02/04/2014 #10

Avatar de cosmefulanito04

Acá te subo el proyecto reducido solo para hacer esa señal cuadrada en 400kHz (dá justo si no me equivoqué).

El código en C es este:

Código:
#include <avr/io.h>
#include <avr/interrupt.h>
 
//-------------- Definiciones de tipos de variables
typedef unsigned char			u8;
typedef unsigned int			u16;
typedef unsigned long int		u32;
typedef unsigned long long int	u64;
//-------------- Definiciones de tipos de variables

//-------------- Variables globales de interrupciones
volatile u8 flag_externa0=0;
//-------------- Variables globales de interrupciones

/*	PUERTO SALIDA TTL		*/

#define PORT_SALIDA_TTL		PORTA
#define DDR_PORT_SALIDA_TTL	DDRA
#define PIN_PORT_SALIDA_TTL	PINA
#define BIT_SALIDA_TTL		PA4

/*----------------------------*/

extern void ttl_frec_var_alta(u8,u8);

#define DISPARO_EXT_NIVEL_BAJO		0
#define DISPARO_EXT_CAMBIO_LOGICO	1
#define DISPARO_EXT_FLANCO_DESC		2
#define DISPARO_EXT_FLANCO_ASC		3


void set_bits (volatile u8 *port, u8 mask)
{
	*port |= mask;
}

void configura_int_externa_0(u8 tipo_de_disparo)
{
	DDRD &= ~(1 << PD2);     // PD2 como entrada
	set_bits(&PORTD,(1<<PD2));
	
	
	MCUCR&=0xfC;
	MCUCR|=(0x03&tipo_de_disparo); // Defino el tipo de disparo
	
	GIFR&=~(1<<INTF0);	//limpio el flag de la interrupción externa
}

int main(void)
{   			
	DDRA=(1<<BIT_SALIDA_TTL);
	
	GICR&=0x3f;			//Deshabilito las interrupciones externas
	GICR|=(1<<INT0);	//Habilito la interrupcion externa 0
	SREG |=0x80;		// Habilito las interrupciones
    
	u8 t_on=5,t_off=5; // 400kHz
	
	while(1)
    {        
		
		//Fvariable=16MHz/{2*[8Clk + 3*(N-1)]}	N esta compuesto por 2 bytes (alto y bajo)
		ttl_frec_var_alta(t_on,t_off);	// Solo sale cuando hay una interrupción externa 0!
		
    }
La función "ttl_frec_var_alta" está hecha en assembler, tiene dos bytes de argumento, que definirán el Ton y el Toff, la frecuencia quedará definida por:

Fvariable=16MHz/{2*[8Clk + 3*(N-1)]}

Me olvidé como funcionaba, pero creo que fijando en 5 Ton y Toff, obtenés 400kHz.

De esa función en assembler, la única forma de salir es usando la interrupción externa 0, de lo contrario se la pasa generando la señal.

El puerto que usé como salida es el PA4, de un atmega 16, se puede modificar fácilmente.

El resto de las funciones sos bastante básicas, configurar los puertos como salida, la externa 0, etc.
Archivos Adjuntos
Tipo de Archivo: zip Generador de Senial.zip (21,7 KB (Kilobytes), 14 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Arduino y Raspberry Pi

Cerrar
Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos » Arduino y Raspberry Pi

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.