Princípio e prática de saída PWM de chip único

1. O que é PWM?

  PWM (Pulse Width Modulation) modulação por largura de pulso , que modula a largura de uma série de pulsos, equivalente à forma de onda necessária (incluindo forma e amplitude) e codifica digitalmente o nível do sinal analógico.   Em termos leigos , é controlar por quanto tempo o nível alto e por quanto tempo o nível baixo (nível alto: 5 / 3,3V, nível baixo: 0V) em um período. Ajuste a mudança de sinal, energia, etc. ajustando a mudança de tempo de nível alto e baixo. A imagem mostra a forma de onda PWM com um período de 4 milissegundos e um ciclo de trabalho de 0,25
Ver imagem fonte
  
A imagem mostra a forma de onda PWM com um período de 4 milissegundos
  

  • Dois conceitos importantes, frequência e ciclo de trabalho

  Frequência: refere-se ao número de vezes que o sinal vai de nível alto para nível baixo e volta para nível alto por segundo , que é o inverso de um ciclo de onda PWM . Figura acima frequência = 1 / (0,003 + 0,001) = 250 Hz
  ciclo de trabalho: refere-se ao elevado nível sustentado por mais de um período de tempo . Na figura acima, a razão de serviço = 1 / (1 + 3) = 25%, então a tensão equivalente da saída pode ser controlada controlando a razão de serviço.
  Portanto, para uma onda quadrada, a frequência e o ciclo de trabalho determinam uma onda.

2. Como uma onda PWM pode ser gerada?

  Método 1 : Use os módulos internos do chip para emitir sinais PWM, exceto para TIM6 e 7 para temporizadores STM32 . Outros temporizadores podem ser usados ​​para gerar saída PWM. Os temporizadores avançados TIM1 e TIM8 podem gerar até 7 saídas PWM ao mesmo tempo. O temporizador de uso geral também pode gerar até 4 saídas PWM ao mesmo tempo, de modo que STM32 pode gerar até 30 saídas PWM ao mesmo tempo! mas! ! ! O mesmo temporizador TIM só pode gerar ondas PWM de uma frequência, e você só pode alterar o ciclo de trabalho. Rotinas específicas podem ser visualizadas no manual de dados STM32 !
  Método 2 : use a porta IO para alterar os níveis alto e baixo para produzir o sinal PWM. Por exemplo, na figura acima, primeiro defina o nível para 1, mantenha 1 ms, depois baixe o nível, mantenha 3 ms e, em seguida, defina o nível alto e assim por diante. Uma onda PWM com um período de 4 milissegundos e uma taxa de trabalho de 25% pode ser gerada. O método específico é adicionar um temporizador à porta IO e usar a interrupção do temporizador para alternar entre os níveis alto e baixo no tempo. Veja a parte do código 51 MCU atrás.

  • Cronômetro

  Se você deseja usar 51 microcomputadores de chip único para gerar um PWM, de acordo com o método 2 acima, você deve primeiro saber o que é um temporizador? Como funciona o cronômetro?

  Temporizador : É a mesma coisa que o contador, porque pode cronometrar e contar. A essência do temporizador é acumular da frequência da máquina para um registro de 16 bits e acionar uma interrupção quando o acúmulo estourar. Para gerar um intervalo de tempo que desejamos. Por exemplo, 1s, portanto, precisamos definir um valor inicial neste registro para que ele possa ser acumulado neste valor inicial para produzir um múltiplo de 1s. Dessa forma, obtemos um intervalo de tempo estável.
  Este registro é dividido em TH (oito bits altos) e TL (oito bits baixos). Portanto, precisamos dividir o valor inicial calculado em duas partes em TH e TL.

  Processo
  Em primeiro lugar, conhecemos o ciclo de clock do oscilador de cristal do microcomputador de chip único, clock cycle * 12 = ciclo da máquina. Cada ciclo da máquina +1 no registro, até que se encha e transborde para gerar uma interrupção.

  Por exemplo,
  se a frequência do relógio externo do microcomputador de chip único é 12MHz, o ciclo do relógio é 1 / 12μs e o ciclo da máquina é 1μs , ou seja, registrador +1 por 1μs. Leva até (2 ^ 16) -1 = 65535μs para um registro de 16 bits estourar. O overflow também requer um ciclo de máquina, portanto, um total de 65536μs. Mas esse valor é muito estranho e não tem nada a ver com os 1s que queremos. É melhor deixá-lo lembrar 50.000μs para gerar uma interrupção, de modo que seu valor inicial seja definido como 65536-50000 = 15536. Mas também precisamos colocar esse valor nos oito dígitos superiores e nos oito dígitos inferiores, portanto, precisamos converter esse número decimal em um número hexadecimal de 4 dígitos e atribuir os valores separadamente. Método de cálculo decimal: TH = 15536/256; TL = 15536% 256; O cálculo do sistema decimal não é discutido em detalhes aqui. Nesse caso, uma interrupção será gerada a cada 50ms. Só precisamos usar o programa para julgar a interrupção 20 vezes e registrar 1s.
   

Três, a aplicação de PWM

1. Saída de tensão analógica ( controle o brilho do LED, a velocidade do motor DC, o tom da campainha, etc. ) pelo nível de tensão. O
  PWM codifica digitalmente o nível do sinal analógico, o computador só pode produzir 0 ou 5 V digital O valor da tensão não pode produzir uma tensão analógica e se quisermos obter um valor de tensão analógica (um valor de tensão entre 0-5 V), precisamos usar um contador de alta resolução para alterar o ciclo de trabalho da onda quadrada para comparar um sinal analógico O nível está codificado. A tensão é presa à carga analógica por uma seqüência de pulsos repetitivos de conexão (1) ou desconexão (0). Conexão significa saída da fonte de alimentação DC e desconexão significa desconexão da fonte de alimentação DC. Ao controlar o tempo de conexão e desconexão, desde que a largura de banda seja suficiente, qualquer tensão analógica não superior ao valor máximo de tensão pode ser emitida.

  Tensão de saída = (no tempo / tempo de pulso) * valor máximo de tensão

Tensão equivalente de saída PWM
   Tensão equivalente de saída PWM
2. No
  processo de controle de um motor de passo para fazer um projeto, um motor de passo é freqüentemente usado quando o controle preciso de deslocamento está envolvido.
  Para um motor de passo bipolar de quatro fios, o sinal de pulso elétrico é convertido em um motor de deslocamento angular para controlar a rotação do rotor. Usado como um atuador em dispositivos de controle automático. Cada vez que um sinal de pulso é recebido, o motor de passo dá um passo à frente, por isso também é chamado de motor de pulso. ! ! ! Observe aqui que se você controlar diretamente o microcomputador de chip único, é o controle de pulso, ou seja, um sinal de pulso entra e o motor de passo gira em um ângulo de passo (geralmente 0,9 °). Portanto, a maneira de controlar a velocidade de um motor de passo é controlar a  frequência  (o ciclo de trabalho é geralmente de 50%), mas! ! ! Agora o ângulo do passo pode ser subdividido conectando-se a placa de acionamento do motor de passo. Por exemplo, se for subdividido em 2, um motor de passo de pulso girará meio pulso (0,45 °)


Quatro, 51 rotinas de microcontrolador

  Aqui, 51 é usado para realizar a função da luz de respiração . O mesmo princípio também pode controlar o motor DC; o motor de passo controla a velocidade controlando a frequência e a campainha controla o tom controlando a frequência.

Fiação: Conecte P1.0 a qualquer luz LDE!

Escreva a descrição da imagem aqui
Existem dois métodos de implementação: sem temporizador (atraso),
atraso do
temporizador e uso do temporizador. A diferença é que o atraso é a adição e subtração de variáveis ​​na função de atraso. Durante o atraso, o microcontrolador só pode executar o atraso. No caso de um                                               temporizador de função , os registros TH e TL são continuamente acumulados até que o manipulador de interrupção seja executado uma vez quando estourar, durante o qual o microcontrolador também pode executar outros programas!

1. Sem cronômetro (apenas use o atraso)

/***
*源代码来来自于 https://www.bilibili.com/read/cv4779664
*pwm LED呼吸灯
*现象:亮-灭-亮 循环
*LED接口:P1.0
*思路:改变延时时间实现亮度不一从而实现呼吸的效果
******/
#include <reg52.h> //引用头文件

sbit led=P1^0;     //LED接口

bit ledsign=0;     //定义一个标志位ledsign==0 

void delay(int);   //声明延时函数
   
void main()
{
  int i=0;         //i:延时控制变量
  while(1)         
  {
   if(ledsign==0)   //如果b=0(初始0)(灯由亮到灭)
		 {   
				led=1;         //灭
				delay(i);      //i秒后(i从小到大)
				led=0;         //亮
				delay(1000-i); //延时1000(可自行定义)-i秒后
				i+=2;          //增加i(开灯的时间)
        if(i>=1000) 
        {	
            ledsign=1;     //i到最大值(>1000)改变标志位下一阶段(灯由灭到亮)
        }
   }
   else if(ledsign==1)         //判断是否进入到下一阶段(灯由灭到亮)
   {       
      led=1;    //灭
      delay(i);   //i秒后(i在上一阶段已到最大值(>1000))
      led=0;    //亮
      delay(1000-i);//延时1000(随手定义)-i秒后
      i-=2;     //减少i(开灯的时间)
      if(i<=0) 
      {
        ledsign=0;//判断是否回到上一阶段
      }
   }
   
  }
}

void delay(int a)      //定义延时函数
{
  int i;
  for(i=0;i<a;i++);
}

 2. Use o cronômetro

#include<reg52.h>
/*************************

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

sbit LED = P1^0;

unsigned char PWM_COUNT;  	 //计数
unsigned int  HUXI_COUNT;    //占空比更新时间
unsigned char PWM_VLAUE;     //占空比比对值
bit direc_flag;             //占空比更新方向

void timer0_init(void);
	
void main()
{
    HUXI_COUNT = 0;
    PWM_COUNT = 0;
    PWM_VLAUE = 5;
    direc_flag = 0;
    LED = 1;            //默认LED熄灭   
    timer0_init();      //定时器0初始化
    while(1);
}

void timer0_init()
{
    TMOD=0x02;          		//  工作于模式2(M1=1,M0=0)
    TH0=0x38;               //定时器溢出值设置,每隔200us发起一次中断。12M晶振
    TL0=0X38;
    ET0=1;                  //开定时器0中断
    EA=1;                       //开总中断
    PWM_COUNT =0;
	  TR0=1;                  //定时器0开始计时
}

void time0() interrupt 1
{   
    PWM_COUNT++;
    HUXI_COUNT++;
    if(PWM_COUNT == PWM_VLAUE)      //判断是否到了点亮LED的时候
        LED = 0;                    //点亮LED
    if(PWM_COUNT == 10)             //当前周期结束
    {
        LED = 1;                    //熄灭LED
        PWM_COUNT = 0;              //重新计时
    }

    if((HUXI_COUNT == 600) && (direc_flag == 0))
    {                               //占空比增加10%
        HUXI_COUNT = 0;
        PWM_VLAUE++;
        if(PWM_VLAUE == 9)          //占空比更改方向
            direc_flag = 1; 
    }

    if((HUXI_COUNT == 600) && (direc_flag == 1))
    {                               //占空比减少10%
        HUXI_COUNT = 0;
        PWM_VLAUE--;
        if(PWM_VLAUE == 1)          //占空比更改方向
            direc_flag = 0; 
    }   
}

 

Acho que você gosta

Origin blog.csdn.net/qq_27148893/article/details/110194229
Recomendado
Clasificación