Red de conocimiento informático - Material del sitio web - Informe de propuesta sobre la realización de un sistema de control de velocidad PWM de motores de CC utilizando software basado en microcontrolador

Informe de propuesta sobre la realización de un sistema de control de velocidad PWM de motores de CC utilizando software basado en microcontrolador

Aquí hay un LED de control PWM para su referencia

Utilice dos interrupciones del temporizador Timer0 y Timer1 para lograr efectos de luz y oscuridad del LED de control PWM. Entre ellos, Timer0 funciona en el modo 1 para la sincronización del ancho del pulso y Timer1 funciona en el modo 2 para la sincronización del ciclo de trabajo. En este programa, el ancho del pulso es un valor fijo y el ciclo de trabajo se cambia aumentando y disminuyendo para lograr el efecto de luz y oscuridad del LED. Si reemplaza el LED con un timbre, puede cambiar el tono cambiando el ancho del pulso.

/***************************************/

//Nombre del archivo: main.c

//Autor: jammy-lee

//Fecha: 2009-3-18

/ /Función: Utilice dos temporizadores para simular PWM

/******************************** * *****/

//Archivo de encabezado

#include

//Definición de macro

typedef unsigned char uint8;

typedef unsigned int uint16;

typedef long unsigned int uint32;

uint16 time0;

uint16 PULSE_WIDTH = 0x300 ; //Ancho de pulso

uint8 DUTY_CYCLE = PULSE_WIDTH*(1/5); //Ciclo de trabajo

//Retraso de subrutina

void delay(uint8 ms )

{

uint8 i;

mientras(ms--)

{

para(i =0;i<120;i++);

}

}

//Temporizador 0, control de nivel bajo

void Timer0 () interrumpir 1

{

TR1 = 0; //Apagar el temporizador 1

time0 = 0xFFFF - PULSE_WIDTH // Valor inicial del temporizador 0

TL0 = (uint8)tiempo0;

TH0 = tiempo0 >> 8;

TH1 = DUTY_CYCLE;

TR1 = 1;

P0 = 0x00; //Abrir temporizador 1

}

//Temporizador 1. Control de nivel alto

void Timer1() interrupción 3

{

TR1 = 0; //Cerrar temporizador 1

P0 = 0xFF;

}

//Función principal

int main(void)

{

TMOD = 0x21; //Temporizador 1: modo de trabajo 1, temporizador 0: modo de trabajo 2

time0 = 0xFFFF - PULSE_WIDTH; //Valor inicial del temporizador 0

TL0 = (uint8)time0;

TH0 = time0 >> 8;

TL1 = DUTY_CYCLE;

TH1 = DUTY_CYCLE;

EA = 1; //Permitir interrupción global

ET0 = 1; interrupción del temporizador 0

ET1 = 1; //Permitir interrupción del temporizador 1

TR0 = 1;

//bucle principal

mientras (1)

{

hacer{

if(DUTY_CYCLE != PULSE_WIDTH*( 1/4))

{

DUTY_CYCLE++;

retraso(5);

}

si no descanso;

}mientras(

1);

hacer{

if(DUTY_CYCLE != 0x01)

{

DUTY_CYCLE--;

retraso(5);

}

si no pausa;

}mientras(1);

}

}