蓝桥杯嵌入式——PWM模式

如何把定时器设置成PWM模式,从而产生相应频率,相应占空比的PWM波

蓝桥杯主要考的定时器也就三个TIM1TIM2TIM3

TIM3如何配置PWM

PA6对应通道一,PA7对应通道2

//pwm.h

#ifndef __PWM_H
#define __PWM_H

#include "stm32f10x.h"

void TIM3_PWM_Init(u16 pwm_fre,u8 ch1_duty,u8 ch2_duty);

#endif
#include "pwm.h"

void TIM3_PWM_Init(u16 pwm_fre,u8 ch1_duty,u8 ch2_duty)
{
	u16 arr;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	arr=1000000/pwm_fre;
	TIM_TimeBaseStructure.TIM_Period = arr-1;		//计数值
        TIM_TimeBaseStructure.TIM_Prescaler = 72-1;		//分频系数 72分频
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;		//向上计数
        TIM_TimeBaseStructure.TIM_CounterMode = 0x0;		//不分频
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = (arr-1)*ch1_duty/100;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = (arr-1)*ch2_duty/100;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	
	TIM_CtrlPWMOutputs(TIM3,ENABLE);
	TIM_Cmd(TIM3, ENABLE);
}

stm32f1的主频是72MHZ,那么在我们不分频的情况下,TIM3的主频也是72M,那么72M的计数速度我们觉得太快了,同时也不方面我们进行计算,所以让TIM3的时钟进行72分频,那么分频系数就是72 - 1。分频后我们的定时器将以1M的速度进行计数,那么这个计数值是非常方面计算的。能换算一下,1MHZ的计数频率,我们换算成周期那么就是1us,也就是说我们的计数值是每过1us加一。我们在初始化函数里传入一个入口参数代表我们设定的频率值(单位是HZ),我们把频率值换算成计数值,也就是1000000/pwm_fre

TIM_Pulse则代表的是你的电平翻转值

 

我们画一个简图,假设我们的计数值为2000,pulse为1000

当我们的计数值到2000后就会清零不断的进行向上计数,假如当前计数值小于pulse,那么输出的为高电平,假如当前技术值大于pulse,那么输出就为低电平,这样的能够实现50%占空比的PWM波了。                       

就简单的来说,pulse就是用来设置你的占空比的,我们只需要把pulse设置成 计数值x 占空比就可以了

 

我们先把频率设置成1000HZ,PA6产生40%占空比的方波,PA7产生80%占空比的方波

那么再来设置成5000HZ,PA6产生10%占空比的方波,PA7产生30%占空比的方波

//main.c

#include "stm32f10x.h"
#include "lcd.h"
#include "pwm.h"

u32 TimingDelay = 0;

void Delay_Ms(u32 nTime);

//Main Body
int main(void)
{
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	SysTick_Config(SystemCoreClock/1000);
	
	TIM3_PWM_Init(5000,10,30);

	while(1)
	{
			
	}
}

//
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

使用PWM模式有一个缺点同一定时器中,不同的通道下,输出的频率固定,占空比可变。也就是说,假如我们通道1输出1KHZ方波,那么通道同样也是1KHZ 方波。

 

这种PWM模式在对于我们日常的控制使用上是没有问题的,但是你看蓝桥杯历年赛题的时候,会看到许多题目要你使用一个定时器,不同通道上让你产生不同频率,不同占空比的方波,甚至还有题目让你产生相位不同的方波,那么在这种情况下显然PWM模式时达不到这种效果的,我们就要换一种方式

STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Output

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯嵌入式开发板支持PWM输出,可以通过配置寄存器来实现。下面是一个简单的PWM输出的例子: ```c #include "stm32f10x.h" void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); } int main(void) { PWM_Init(); while (1) { } } ``` 上述代码中,我们使用了TIM3定时器来实现PWM输出。首先,我们需要初始化GPIO引脚,将其配置为复用推挽输出模式。然后,我们需要初始化TIM3定时器,设置其时钟分频、计数模式、计数周期等参数。最后,我们需要初始化TIM3的输出比较通道,设置其PWM模式输出状态、占空比等参数。在初始化完成后,我们使能TIM3定时器,即可开始输出PWM波形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值