Banner publicitario de PCBWay

Transmisor de FM Estéreo con RDS/RDBS QN8027

No , no tiene salida de rf, ni se escucha , nada de nada, con un pll Chino da los 15 W y todo normal.
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.
 
Desconozco 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.
 

Adjuntos

  • foto1.png
    foto1.png
    885.8 KB · Visitas: 20
Gracias a GARADA he podido solucionar el problema. Como sospechaba la dicha avería era el modulo qn8006 que garada amablemente, me consiguio
:aplauso::aplauso::aplauso:
La potencia estimada entre 0.5 a los 12 de salida en 88 MHz y los 4 a 5 en el 108 MHz suena muy bien, y la separación entre canales.
es muy buena
 

Adjuntos

  • IMG_20240912_190336.jpg
    IMG_20240912_190336.jpg
    134 KB · Visitas: 13
  • IMG_20240912_190336.jpg
    IMG_20240912_190336.jpg
    134 KB · Visitas: 17
  • IMG-20240912-WA0052.jpeg
    IMG-20240912-WA0052.jpeg
    158.7 KB · Visitas: 18
  • IMG-20240912-WA0050.jpeg
    IMG-20240912-WA0050.jpeg
    198.1 KB · Visitas: 16
  • IMG-20240912-WA0061.jpeg
    IMG-20240912-WA0061.jpeg
    105.9 KB · Visitas: 14
  • IMG-20240911-WA0004.jpeg
    IMG-20240911-WA0004.jpeg
    116.1 KB · Visitas: 12
  • IMG_20240912_190656.jpg
    IMG_20240912_190656.jpg
    43.5 KB · Visitas: 11
  • IMG-20240903-WA0004.jpg
    IMG-20240903-WA0004.jpg
    140.8 KB · Visitas: 10
  • IMG_20240911_125021.jpg
    IMG_20240911_125021.jpg
    91.5 KB · Visitas: 11
Última edición:
Os dejo aquí el código fuente del firmware en ccs para el qn8027 y un pic16f628a, a este diseño le falta la visualización de la frecuencia y potencia, y 2 encoders rotatorios para variar la frecuencia y potencia y almacenarlos en sus pulsadores centrales, así como el software de control, este diseño tiene implementadas todas las funciones, un resumen para entender lo que hace:

Resumen claro y técnico de las propiedades y funciones de este archivo:


🧾 Descripción General del Archivo

Este archivo es un programa completo en C para el compilador CCS destinado a un PIC16F628A. Implementa un transmisor FM basado en el chip QN8027, controlado mediante:
  • ✅ Dos encoders rotativos (frecuencia y potencia)
  • ✅ Una pantalla LCD por I²C
  • ✅ Memoria EEPROM interna
  • ✅ Comunicación I²C con el QN8027
Es un firmware autónomo listo para funcionar en hardware real.


⚙️ Propiedades de Configuración del Microcontrolador

PropiedadValor
MicrocontroladorPIC16F628A
Resolución ADC10 bits
Frecuencia del reloj4 MHz
Modo I²CMaestro
SDAPIN_B0
SCLPIN_B1
Velocidad I²Cslow


📡 Módulo QN8027 (Transmisor FM)

Dirección I²C​

  • 0x58
Funciones Implementadas:

FunciónPropó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

📌 Rango de frecuencia usado: 87.5 MHz a 108.0 MHz


💾 EEPROM (Memoria No Volátil)

Se usa para guardar ajustes del usuario:

DirecciónUso
0x00Parte alta de frecuencia
0x01Parte baja de frecuencia
0x01Potencia

Funciones:​

  • eeprom_read_byte()
  • eeprom_write_byte()
✅ Permite que el equipo recuerde frecuencia y potencia tras apagarlo.


🖥️ Módulo LCD I²C (Simplificado)

Funciones incluidas (sin implementación real):
  • lcd_init()
  • lcd_clear()
  • lcd_gotoxy()
  • lcd_putc()
  • lcd_print()
🔧 Estas son plantillas, pensadas para ser conectadas a una librería real.


🎛️ Encoders Rotativos

Se usan dos encoders con pulsador:

EncoderFunción
Encoder 1Frecuencia
Encoder 2Potencia

Pines usados:​

  • Frecuencia: A0, A1, A2
  • Potencia: A3, A4, A5

Funciones:​

  • encoder_freq_read() → devuelve +1, -1 o 0
  • encoder_pot_read()
  • encoder_freq_pressed()
  • encoder_pot_pressed()

📊 Variables Globales​

VariableTipoUso
frecuenciaunsigned int16Frecuencia FM ×10
potenciaunsigned charNivel de salida (0–15)


🖥️ Gestión de Pantalla LCD​

Función:
  • actualizar_lcd()
Muestra:
  • ✅ Frecuencia en formato: 98.3 MHz
  • ✅ Potencia en porcentaje: 0–100%

🔁 Funcionamiento del main()

1. Inicialización​

  • Configura puertos
  • Inicializa LCD
  • Lee EEPROM
  • Inicializa QN8027
  • Actualiza LCD

2. Bucle Principal​

  • Lee encoders en tiempo real
  • Ajusta:
    • Frecuencia
    • Potencia
  • Actualiza QN8027
  • Actualiza LCD
  • Guarda en EEPROM al pulsar botones
  • Incluye debounce por delay_ms(50)

✅ Qué Hace Este Firmware en Conjunto

✔ Controla un transmisor FM digital completo
✔ Permite cambiar frecuencia y potencia en tiempo real
✔ Muestra datos en LCD
✔ Guarda los ajustes en EEPROM
✔ Usa I²C para QN8027 y LCD
✔ Interfaz totalmente física con doble encoder


⚠️ Observaciones Importantes
  • Las funciones del LCD no están implementadas, solo declaradas.
  • No hay validación de errores I²C.
  • No hay interrupciones, todo es por polling.
  • El uso de EEPROM es básico pero funcional.

🔁 Funcionamiento del main()

1. Inicialización​

  • Configura puertos
  • Inicializa LCD
  • Lee EEPROM
  • Inicializa QN8027
  • Actualiza LCD

2. Bucle Principal​

  • Lee encoders en tiempo real
  • Ajusta:
    • Frecuencia
    • Potencia
  • Actualiza QN8027
  • Actualiza LCD
  • Guarda en EEPROM al pulsar botones
  • Incluye debounce por delay_ms(50)

✅ Qué Hace Este Firmware en Conjunto

✔ Controla un transmisor FM digital completo
✔ Permite cambiar frecuencia y potencia en tiempo real
✔ Muestra datos en LCD
✔ Guarda los ajustes en EEPROM
✔ Usa I²C para QN8027 y LCD
✔ Interfaz totalmente física con doble encoder


⚠️ Observaciones Importantes
  • Las funciones del LCD no están implementadas, solo declaradas.
  • No hay validación de errores I²C.
  • No hay interrupciones, todo es por polling.
  • El uso de EEPROM es básico pero funcional.
 

Adjuntos

  • main_version_2.zip
    1.7 KB · Visitas: 4
El archivo con soporte para 2 encoders y lcd mostrando potencia y frecuencia.

C++:
// ====================================================================================
// 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);
    }
}
Resumen del archivo main.c para generar el firmware PIC16F628A+QN8027:

Resumen de características del proyecto


1️⃣ Microcontrolador y Hardware​


  • Microcontrolador: PIC16F628A.
  • Reloj: 4 MHz.
  • ADC: 10 bits.
  • Comunicación I2C: Maestro, pines B0 (SDA) y B1 (SCL), velocidad lenta.
  • LCD: Pantalla I2C 16x2 (PCF8574).
  • Encoders:Dos encoders rotativos con pulsador:
    • Frecuencia: Pines A0/A1, pulsador A2.
    • Potencia: Pines A3/A4, pulsador A5.



2️⃣ Transmisor FM (QN8027)​


  • Frecuencia: 87.5 – 108.0 MHz (en unidades de 10 kHz).
  • Potencia: 0 – 15 (aprox. 0–100%).
  • Funciones implementadas:
    • Inicialización y reset.
    • Selección de frecuencia y potencia.
    • Inicio de transmisión FM.
  • Control dinámico: Se puede ajustar en tiempo real mediante encoders.



3️⃣ RDS (Radio Data System) dinámico​


  • PS (Program Service): 8 caracteres, dinámico, actualizado continuamente.
  • RT (Radio Text): Hasta 64 caracteres, dinámico, actualizado continuamente.
  • Envío por bloques de 2 caracteres mediante I2C.
  • Integrado al loop principal sin bloquear otras funciones.
  • Se puede actualizar en cualquier momento con strcpy().



4️⃣ LCD I2C​


  • Visualización:
    • Línea 1: Frecuencia (Frec: 98.3MHz).
    • Línea 2: Potencia (Pot: 100%).
  • Funciones disponibles: Clear, gotoxy, putc, print, init.
  • Actualización en tiempo real con cambios de frecuencia y potencia.



5️⃣ EEPROM​


  • Persistencia: Frecuencia y potencia se guardan al presionar los pulsadores de los encoders.
  • Direcciones:
    • Frecuencia: 0x00 (parte entera) + 0x01 (parte decimal).
    • Potencia: 0x02.



6️⃣ Software / Loop principal​


  • Control de encoders: Detecta giro y pulsación para frecuencia y potencia.
  • Actualización de QN8027: Cambios de frecuencia y potencia en tiempo real.
  • Actualización de RDS: PS y RT enviados dinámicamente cada ciclo.
  • Delay anti-rebote: 50 ms entre ciclos de loop.
  • LCD: Siempre actualizado con los últimos valores.



7️⃣ Uso de memoria y compilación​


  • ROM: 63% usada.
  • RAM: 40–57% usada.
  • Compilación: Sin errores ni warnings.



✅ Resumen de funcionalidades clave:


  • Transmisión FM estable y controlable en frecuencia y potencia.
  • PS y RT dinámicos via RDS.
  • Visualización clara en LCD.
  • Persistencia EEPROM de configuración.
  • Interacción intuitiva mediante encoders con pulsadores.
 
Última edición:
Creo que funcionaria, pero tendria que montarlo, tengo montado el si4713 que tambien tengo su main.c con todas las propiedades y probare a ver que tan funciona. De todos modos hice una aplicación en pascal para dividir un bmp de 24bits en lineas pares e impares, con el objetivo de hacer una carta de ajuste compleja como la fubk o philips pm5544 y con gemini funciono a la primera, genera los 2 archivos hex sin problema, de todos modos tanto el qn8027 como el si4713 es dificil que te generen los archivos sin errores porque si, es complicado pero no dificil.
 
Encontré una plaquita que tiene ese integrado, pero como se ve en las imágenes... mejor no experimentar más, todas las señales que se ven son tomadas directo de la salida de la placa con 1 etapa de potencia directo al analizador. Es posible que el programa funcione, pero mejor no seguir jugando con este qn8027, dado que no se puede aprovechar por separado el rds, por último digo yo.... no valdría la pena mucho más con este chip.
 

Adjuntos

  • 20251205_174346.jpg
    20251205_174346.jpg
    341.8 KB · Visitas: 3
  • PNG16.png
    PNG16.png
    53.5 KB · Visitas: 3
  • 20251205_173935.jpg
    20251205_173935.jpg
    290.2 KB · Visitas: 3
  • 20251205_173835.jpg
    20251205_173835.jpg
    276.9 KB · Visitas: 3
Atrás
Arriba