#include "stm32f4xx.
h"
#include <math.h>
// Definir pines de salida
#define PIN1 GPIO_Pin_0
#define PIN2 GPIO_Pin_1
#define PIN3 GPIO_Pin_2
#define PIN4 GPIO_Pin_3
#define PIN5 GPIO_Pin_4
#define PIN6 GPIO_Pin_5
// Prototipos de funciones
void generarOndaSinusoidal(void);
void generarOndaCuadrada(void);
void generarOndaTiratron(void);
void generarOndaExponencial(void);
void generarOndaTriangular(void);
void generarOndaDienteDeSierra(void);
int main(void) {
// Inicializar el sistema
SystemInit();
// Habilitar el reloj del puerto GPIO correspondiente
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// Configurar los pines como salida
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1) {
// Generar diferentes tipos de ondas
generarOndaSinusoidal();
generarOndaCuadrada();
generarOndaTiratron();
generarOndaExponencial();
generarOndaTriangular();
generarOndaDienteDeSierra();
// Generar onda sinusoidal
void generarOndaSinusoidal(void) {
float frecuencia = 1000; // Frecuencia en Hz
float amplitud = 3.3; // Amplitud en voltios
float periodo = 1 / frecuencia; // Periodo en segundos
float tiempo = 0;
while (tiempo < periodo) {
float valor = amplitud * sin(2 * M_PI * frecuencia * tiempo);
// Configurar los pines de salida con el valor correspondiente
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
if (valor > amplitud / 2) {
GPIO_SetBits(GPIOA, PIN2);
} else {
GPIO_ResetBits(GPIOA, PIN2);
if (valor > amplitud / 4) {
GPIO_SetBits(GPIOA, PIN3);
} else {
GPIO_ResetBits(GPIOA, PIN3);
if (valor > amplitud / 8) {
GPIO_SetBits(GPIOA, PIN4);
} else {
GPIO_ResetBits(GPIOA, PIN4);
if (valor > amplitud / 16) {
GPIO_SetBits(GPIOA, PIN5);
} else {
GPIO_ResetBits(GPIOA, PIN5);
if (valor > amplitud / 32) {
GPIO_SetBits(GPIOA, PIN6);
} else {
GPIO_ResetBits(GPIOA, PIN6);
tiempo += 1 / 10000.0; // Incremento de tiempo para la muestra (ajustar según sea necesario)
// Generar onda cuadrada
void generarOndaCuadrada(void) {
float frecuencia = 1000; // Frecuencia en Hz
float periodo = 1 / frecuencia; // Periodo en segundos
float tiempo = 0;
while (tiempo < periodo) {
float valor = tiempo < periodo / 2 ? 3.3 : 0;
// Configurar los pines de salida con el valor correspondiente
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN2);
} else {
GPIO_ResetBits(GPIOA, PIN2);
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN3);
} else {
GPIO_ResetBits(GPIOA, PIN3);
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN4);
} else {
GPIO_ResetBits(GPIOA, PIN4);
}
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN5);
} else {
GPIO_ResetBits(GPIOA, PIN5);
if (valor > 0) {
GPIO_SetBits(GPIOA, PIN6);
} else {
GPIO_ResetBits(GPIOA, PIN6);
tiempo += 1 / 10000.0; // Incremento de tiempo para la muestra (ajustar según sea necesario)
// Generar onda tiratrón
void generarOndaTiratron(void) {
uint16_t periodo = 1000; // Periodo de la onda en microsegundos
uint16_t tiempo;
for (tiempo = 0; tiempo < periodo; tiempo++) {
// Calcular el valor del pin1 en función del tiempo
uint16_t valor1 = (tiempo * 4095) / periodo;
// Calcular el valor del pin2 como el complemento del pin1
uint16_t valor2 = 4095 - valor1;
// Establecer los valores de los pines
if (valor1 > 2047) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
if (valor2 > 2047) {
GPIO_SetBits(GPIOA, PIN2);
} else {
GPIO_ResetBits(GPIOA, PIN2);
// Retardo para controlar la frecuencia de la onda
for (volatile uint32_t i = 0; i < 1000; i++);
// Generar onda exponencial
void generarOndaExponencial(void) {
void generarOndaExponencial(void) {
uint16_t periodo = 1000; // Periodo de la onda en microsegundos
float base = 2.71828; // Base del exponente (e)
uint16_t tiempo;
for (tiempo = 0; tiempo < periodo; tiempo++) {
// Calcular el valor del pin en función del tiempo
float exponente = (float)tiempo / periodo;
float valor = pow(base, exponente);
// Escalar y ajustar el valor para que esté dentro del rango del pin
uint16_t valor_pin = (uint16_t)(valor * 4095);
// Establecer el valor del pin
if (valor_pin > 2047) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
// Retardo para controlar la frecuencia de la onda
for (volatile uint32_t i = 0; i < 1000; i++);
// Generar onda triangular
void generarOndaTriangular(void) {
uint16_t periodo = 1000; // Periodo de la onda en microsegundos
uint16_t tiempo;
for (tiempo = 0; tiempo < periodo; tiempo++) {
// Calcular el valor del pin en función del tiempo
uint16_t valor = (tiempo * 8191) / periodo;
// Ajustar el valor para que esté dentro del rango del pin
if (valor > 4095) {
valor = 8191 - valor;
// Establecer el valor del pin
if (valor > 2047) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
// Retardo para controlar la frecuencia de la onda
for (volatile uint32_t i = 0; i < 1000; i++);
// Generar onda diente de sierra
void generarOndaDienteDeSierra(void) {
void generarOndaDienteDeSierra(void) {
uint16_t periodo = 1000; // Periodo de la onda en microsegundos
uint16_t tiempo;
for (tiempo = 0; tiempo < periodo; tiempo++) {
// Calcular el valor del pin en función del tiempo
uint16_t valor = (tiempo * 4095) / periodo;
// Establecer el valor del pin
if (valor > 2047) {
GPIO_SetBits(GPIOA, PIN1);
} else {
GPIO_ResetBits(GPIOA, PIN1);
// Retardo para controlar la frecuencia de la onda
for (volatile uint32_t i = 0; i < 1000; i++);