0% encontró este documento útil (0 votos)
5 vistas10 páginas

Generación de Ondas en STM32 F4

Cargado por

Barbaro Molina
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas10 páginas

Generación de Ondas en STM32 F4

Cargado por

Barbaro Molina
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

#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++);

También podría gustarte