STM32 (7) - Análise do Princípio do PWM de Saída do Temporizador

conceito + código


1. Comparação de saída

Comparação de saída OC (Output Compare) A comparação de saída pode definir o nível de saída para 1, definir para 0 ou
inverter a operação comparando a relação entre os valores de registro CNT e CCR e é usada para gerar formas de onda PWM com uma certa frequência e dever ciclo.
Tanto o temporizador avançado quanto o temporizador de uso geral têm 4 canais de comparação de saída. Os
primeiros 3 canais do temporizador avançado têm adicionalmente a função de geração de zona morta e saída complementar

2. Princípio do PWM

PWM (Modulação por largura de pulso) Modulação por largura de pulso
Em um sistema com inércia, os parâmetros analógicos necessários podem ser obtidos de forma equivalente modulando a largura de uma série de pulsos. É frequentemente usado no campo de controle de velocidade do motor. Parâmetros PWM:
frequência
= 1 / Ciclo de trabalho TS
= TON / TS (a proporção de nível alto para tempo total), se o ciclo de trabalho for 50%, nível alto = 5V, nível baixo = 0V, então a tensão analógica é 2,5V. Taxa de resolução =
serviço etapa de mudança de ciclo, ou seja, precisão.
insira a descrição da imagem aqui
A estrutura básica do PWM:
insira a descrição da imagem aqui
insira a descrição da imagem aqui
Quando a contagem CNT for menor que CCR, defina o nível alto, quando CNT for maior que CCR, defina o nível baixo, quando CNT=ARR acionar um evento, o valor da contagem retorna a zero e uma nova rodada de o ciclo começa, de modo que possa continuamente emitir o sinal PWM. Portanto, pode-se ver que a configuração do valor CCR está intimamente relacionada ao ciclo de trabalho.
Frequência PWM: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
CK_PSC é a frequência prescaler, geralmente a frequência do sistema. PSC é o fator de divisão de frequência e ARR é o valor máximo de contagem do registrador de recarga automática.
Ciclo de trabalho PWM: Duty = CCR / (ARR + 1)
CCR é um valor de comparação limitado de PWM de saída de comparação de saída.
Resolução PWM: Reso = 1 / (ARR + 1)

3. Saída PWM

Tome como exemplo o experimento pontual de PWM atômico: use o canal CH2 do TIM3 para gerar ondas PWM na porta PB5.

1. Inicialização PWM

void TIM3_PWM_Init(u16 arr,u16 psc)
{
    
    
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    //使能定时器3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形    GPIOB.5
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
   //初始化TIM3
    //溢出时间time=(arr+1)*(psc+1)/144000000
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = 1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

    //初始化TIM3 Channel2 PWM模式
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    TIM_OCInitStructure.TIM_Pulse = 50;
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
    TIM_Cmd(TIM3, ENABLE);  //使能TIM3
}

As coisas mais importantes aqui são:
1. Os parâmetros desta função são arr e psc, que representam o valor do registro de auto-recarregamento e o coeficiente do prescaler, respectivamente. De acordo com esses dois parâmetros, a frequência e o ciclo de trabalho do PWM podem ser calculados.

2. Na função, primeiro habilite o timer TIM3 e o relógio do periférico GPIOB, e o relógio do módulo de função de multiplexação do GPIO. Em seguida, mapeie o sinal TIM3_CH2 para o pino GPIOB.5 através da função GPIO_PinRemapConfig.
Aqui está uma pergunta: por que configurar o relógio do módulo de função de multiplexação AFIO? Conforme mostrado na figura abaixo
insira a descrição da imagem aqui
: Você pode ver que a função de multiplexação padrão do PB5 é I2C1_SMBA/ SPI3_MOSI, I2S3_SD e sua função de redefinição é TIM3_CH2, portanto não pode ser reutilizada de forma simples e direta e o remapeamento deve ser configurado.

3. Inicialize o canal 2 do TIM3 por meio da estrutura TIM_OCInitTypeDef, selecione o modo do temporizador como PWM2, habilite a saída de comparação, defina a polaridade de saída para o nível alto e defina o ciclo de trabalho para 50%.
Por fim, habilite o registrador de pré-carga do TIM3 no CCR2 através da função TIM_OC2PreloadConfig, e habilite o TIM3 através da função TIM_Cmd.

2. Onda PWM de frequência especificada de saída

   TIM3_Int_Init(5999,0);
   //TIM3_PWM_Init(5999,0);//不分频。PWM 频率=96000/(5999+1)=16KHz

Frequência PWM de referência : Freq = CK_PSC / (PSC + 1) / (ARR + 1) , aqui a frequência do sistema do meu chip é 96MHz, correspondente a CK_PSC, ARR é o valor da contagem, PSC é o valor do prescaler, substitua na fórmula, obtenha : frequência F=16000Hz=16KHz.
Portanto, este código gera uma onda PWM com uma frequência fixa de 16KHz.

3. Onda PWM de saída com ciclo de trabalho variável

TIM3_Int_Init(5999,0);
u16 pulse=400;
TIM_SetCompare2(TIM3,pulse);

Para o timer TIM3, a faixa de valores do registrador CCR2 é de 0 a ARR, ou seja, o valor do registrador de comparação não pode ser maior que o valor do registrador de auto-recarregamento . Portanto, ao definir o ciclo de trabalho, o valor do ciclo de trabalho de entrada precisa ser convertido no valor do registro de comparação correspondente por meio de cálculo. Ou seja, o valor do pulso só pode ser definido entre 0-5999, e observe que a função chamada aqui é a função TIM_SetCompare2(), que é o registrador de comparação CCR2 correspondente ao canal 2. Se for ch3, o TIM_SetCompare3 () deve ser chamada. Desta forma, o ciclo de trabalho da onda PWM é modificado.

Acho que você gosta

Origin blog.csdn.net/qq_53092944/article/details/130703311
Recomendado
Clasificación