Daniel Lopes
Miembro Geconocido
!Cielo santo , inmaginen ese transmissor "basurento" con 15 Wattios en una buena Antenna !
!Puebre de los receptores de FM cercanos a el !
!Puebre de los receptores de FM cercanos a el !
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Si , pero eso no significa que el problema sea el QN8006, existe comunicación entre el QN8006 y el controlador? No falla una etapa previa? Hay muchas cosas que comprobar, la unica razón para dañar el modulo QN8006 es superar ampliamente el valor de alimentación de 5V, si este es tu caso puede ser lo que sospechas pero averiarse así por las buenas, lo dudo mucho.No , no tiene salida de rf, ni se escucha , nada de nada, con un pll Chino da los 15 W y todo normal.
Hola, puedes comprar por acaDesconozco el trato dado por el cliente, pero sin el módulo nuevo no puedo hacer más, todos los voltajes están bien , el módulo no lo encuentro en la red ,por eso pido ayuda al foro a encontra el componente perdido.
rds (radio data system)En realidad es una transmissión FM analógica totalmente emulada en un software mas conocida como "RDS" (Radio Defined for Software).
Att,
Daniel Lopes.
Si, pero en ese caso don Dani se refiere al SDR en gringo y en español se podría decir como software definido por radio.rds (radio data system)
| Propiedad | Valor |
|---|---|
| Microcontrolador | PIC16F628A |
| Resolución ADC | 10 bits |
| Frecuencia del reloj | 4 MHz |
| Modo I²C | Maestro |
| SDA | PIN_B0 |
| SCL | PIN_B1 |
| Velocidad I²C | slow |
| Función | Propósito |
|---|---|
| qn8027_write_reg() | Escribe un registro por I²C |
| qn8027_init() | Inicializa el chip |
| qn8027_set_freq() | Ajusta la frecuencia FM |
| qn8027_set_power() | Ajusta la potencia (0–15) |
| qn8027_start_tx() | Inicia la transmisión |
| Dirección | Uso |
|---|---|
| 0x00 | Parte alta de frecuencia |
| 0x01 | Parte baja de frecuencia |
| 0x01 | Potencia |
| Encoder | Función |
|---|---|
| Encoder 1 | Frecuencia |
| Encoder 2 | Potencia |
| Variable | Tipo | Uso |
|---|---|---|
| frecuencia | unsigned int16 | Frecuencia FM ×10 |
| potencia | unsigned char | Nivel de salida (0–15) |
// ====================================================================================
// Archivo: main.c
// Dispositivo: PIC16F628A
// Funci n: Transmisor FM con QN8027, control por encoders, LCD I2C, EEPROM y RDS din mico
// ====================================================================================
#include <16F628A.h>
#device ADC=10
#use delay(clock=4000000)
#use i2c(master, sda=PIN_B0, scl=PIN_B1, slow)
// ===========================
// QN8027 (Transmisor FM)
// ===========================
#define QN8027_ADDRESS 0x58
void qn8027_write_reg(unsigned char reg, unsigned char value) {
i2c_start();
i2c_write(QN8027_ADDRESS);
i2c_write(reg);
i2c_write(value);
i2c_stop();
}
void qn8027_init(void) {
qn8027_write_reg(0x00, 0x01); // Reset
delay_ms(10);
qn8027_write_reg(0x01, 0x55); // Oscilador
qn8027_write_reg(0x06, 0x0F); // Potencia m xima
qn8027_write_reg(0x02, 0x00); // Standby
}
void qn8027_set_freq(unsigned int16 freq_val) {
unsigned char low = freq_val & 0xFF;
unsigned char high = freq_val >> 8;
qn8027_write_reg(0x04, low);
qn8027_write_reg(0x05, high);
}
void qn8027_start_tx(void) {
qn8027_write_reg(0x02, 0x88); // Modo transmisi n
}
void qn8027_set_power(unsigned char level) {
if(level > 15) level = 15;
qn8027_write_reg(0x06, level);
}
// ===========================
// EEPROM
// ===========================
#define ADDR_FREQ 0x00
#define ADDR_POT 0x02
unsigned char eeprom_read_byte(unsigned char addr) { return read_eeprom(addr); }
void eeprom_write_byte(unsigned char addr, unsigned char value) { write_eeprom(addr, value); }
// ===========================
// LCD I2C (PCF8574)
// ===========================
#define LCD_ADDR 0x4E
#define RS_COM 0
#define RS_DAT 1
#define LCD_EN 4
#define LCD_BL 8
void i2c_write_lcd(unsigned char value) {
i2c_start();
i2c_write(LCD_ADDR);
i2c_write(value);
i2c_stop();
}
void lcd_send_nibble(unsigned char nibble, unsigned char mode) {
unsigned char data = nibble | (mode ? RS_DAT : RS_COM) | LCD_BL;
i2c_write_lcd(data | LCD_EN);
delay_us(100);
i2c_write_lcd(data & ~LCD_EN);
}
void lcd_send_byte(unsigned char data, unsigned char mode) {
lcd_send_nibble(data & 0xF0, mode);
lcd_send_nibble((data << 4) & 0xF0, mode);
delay_ms(2);
}
void lcd_init(void) {
delay_ms(50);
lcd_send_nibble(0x30, RS_COM); delay_ms(5);
lcd_send_nibble(0x30, RS_COM); delay_us(150);
lcd_send_nibble(0x30, RS_COM); delay_us(150);
lcd_send_nibble(0x20, RS_COM); delay_us(150);
lcd_send_byte(0x28, RS_COM);
lcd_send_byte(0x08, RS_COM);
lcd_send_byte(0x01, RS_COM); delay_ms(2);
lcd_send_byte(0x06, RS_COM);
lcd_send_byte(0x0C, RS_COM);
}
void lcd_clear(void) { lcd_send_byte(0x01, RS_COM); delay_ms(2); }
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char address = (y == 1) ? 0x00 : 0x40;
address += (x - 1);
lcd_send_byte(0x80 | address, RS_COM);
}
void lcd_putc(char c) { lcd_send_byte(c, RS_DAT); }
void lcd_print(char *text) { while(*text) lcd_putc(*text++); }
// ===========================
// Encoders (Entrada)
// ===========================
#define ENC_FREQ_A PIN_A0
#define ENC_FREQ_B PIN_A1
#define ENC_FREQ_BTN PIN_A2
#define ENC_POT_A PIN_A3
#define ENC_POT_B PIN_A4
#define ENC_POT_BTN PIN_A5
unsigned char last_freq_a = 0;
unsigned char last_pot_a = 0;
signed char encoder_freq_read(void) {
signed char delta = 0;
unsigned char a = input(ENC_FREQ_A);
unsigned char b = input(ENC_FREQ_B);
if(a != last_freq_a) delta = (b != a) ? 1 : -1;
last_freq_a = a;
return delta;
}
signed char encoder_pot_read(void) {
signed char delta = 0;
unsigned char a = input(ENC_POT_A);
unsigned char b = input(ENC_POT_B);
if(a != last_pot_a) delta = (b != a) ? 1 : -1;
last_pot_a = a;
return delta;
}
unsigned char encoder_freq_pressed(void) { return !input(ENC_FREQ_BTN); }
unsigned char encoder_pot_pressed(void) { return !input(ENC_POT_BTN); }
// ===========================
// Variables globales
// ===========================
unsigned int16 frecuencia;
signed char potencia;
// ===========================
// Actualizar LCD
// ===========================
void actualizar_lcd() {
char buffer[16];
unsigned char mhz = frecuencia / 10;
unsigned char dec = frecuencia % 10;
unsigned char pot_pct = (unsigned char)potencia * 100 / 15;
lcd_clear();
sprintf(buffer, "Frec: %02u.%1uMHz", mhz, dec);
lcd_gotoxy(1,1); lcd_print(buffer);
sprintf(buffer, "Pot: %03u%%", pot_pct);
lcd_gotoxy(1,2); lcd_print(buffer);
}
// ===========================
// RDS Din mico (PS y RT)
// ===========================
char rds_ps[9] = "MiRadio ";
char rds_rt[65] = "Bienvenidos a la emisora FM QN8027!";
unsigned char rds_ps_index = 0;
unsigned char rds_rt_index = 0;
void qn8027_send_ps_block(void) {
unsigned char i = rds_ps_index * 2;
unsigned char b0 = rds_ps[i];
unsigned char b1 = rds_ps[i + 1];
qn8027_write_reg(0x0A + rds_ps_index, b0);
qn8027_write_reg(0x0A + rds_ps_index, b1);
rds_ps_index = (rds_ps_index + 1) % 4;
}
void qn8027_send_rt_block(void) {
unsigned char b0 = rds_rt[rds_rt_index];
unsigned char b1 = (rds_rt[rds_rt_index + 1] != '\0') ? rds_rt[rds_rt_index + 1] : ' ';
qn8027_write_reg(0x0E, b0);
qn8027_write_reg(0x0F, b1);
rds_rt_index += 2;
if (rds_rt_index >= 64 || rds_rt[rds_rt_index] == '\0') rds_rt_index = 0;
}
void qn8027_update_rds(void) {
qn8027_send_ps_block();
qn8027_send_rt_block();
}
// ===========================
// Programa principal
// ===========================
void main() {
// Configuraci n de puertos
set_tris_a(0xFF); set_tris_b(0x00); output_b(0x00);
lcd_init();
// Leer EEPROM
frecuencia = (unsigned int16)eeprom_read_byte(ADDR_FREQ) * 10;
frecuencia += eeprom_read_byte(ADDR_FREQ + 1);
potencia = eeprom_read_byte(ADDR_POT);
if(frecuencia == 0) frecuencia = 983;
if(potencia == 0) potencia = 15;
// Inicializar QN8027
qn8027_init();
qn8027_set_freq(frecuencia);
qn8027_set_power((unsigned char)potencia);
qn8027_start_tx();
actualizar_lcd();
while(TRUE) {
signed char d_freq = encoder_freq_read();
signed char d_pot = encoder_pot_read();
if(d_freq) {
frecuencia += d_freq;
if(frecuencia < 875) frecuencia = 875;
if(frecuencia > 1080) frecuencia = 1080;
qn8027_set_freq(frecuencia);
actualizar_lcd();
}
if(d_pot) {
potencia += d_pot;
if(potencia > 15) potencia = 15;
if(potencia < 0) potencia = 0;
qn8027_set_power((unsigned char)potencia);
actualizar_lcd();
}
if(encoder_freq_pressed()) {
eeprom_write_byte(ADDR_FREQ, frecuencia/10);
eeprom_write_byte(ADDR_FREQ+1, frecuencia%10);
}
if(encoder_pot_pressed()) {
eeprom_write_byte(ADDR_POT, (unsigned char)potencia);
}
// Actualizaci n din mica RDS
qn8027_update_rds();
delay_ms(50);
}
}
Eso quiere decir que en pantalla no se verá nada? No entiendo esa parte. Este código ha sido probado en un transmisor real? Hay algun videito o imágenes de como es la señal o algo o solo es copy paste de ia?a este diseño le falta la visualización de la frecuencia y potencia