原理部分
背景
GPIO口是数字输出端口,只能输出1和0。但是通过PWM,可以使其控制LED呼吸灯亮灭的程度
1.通过CNT和CCR进行比较,可以输出一定频率和占空比的PWM波形
2.通用定时器有4个CCR,可同时输出4路PWM波形,但只有一个CNT
输出比较部分,通过比较CNT和CCR的值,CNT计数自增,CCR是我们给定的一个值,这样就可以输出一定占空比的输出波形
3.PWM波形
惯性系统就是断电之后不会立刻停止运行的器件,eg:LED
4.如何输出PWM波形
外部比较->输出oc1ref->极性选择->CCIP写0代表不翻转,写1代表翻转->输出使能->OC1->CPIO
本实验只用PWM模式1
5.
时钟源选择->时基单元->输出比较->CNT、CCR比较
我们可以设定CCR为固定值
6.
7.STM32外设
推挽输出示意图:
上管导通,输出高电压,下关导通,输出低电压。
H桥电路,两个推挽电路组成,这是电流从右边流向左边
代码部分
思路
- 开启PWM时钟,TIM外设,GPIO外设
- 时基单元配置
- 配置输出比较单元:CCR值,比较模式,极性选择,输出使能
- GPIO配置:复用推挽输出GPIO口
- 运行控制配置:计数器
实现
实验一
1.复制上一小节的定时器项目,改名为自己想取的名字,在hardware下新建PWM._LED.c和PWM._LED.h文件,并按照江科大老师所给的电路图进行连接
2.PWM._LED.c
#include "stm32f10x.h" // Device header
/**
* 函 数:定时初始化
* 参 数:无
* 返 回 值:无
* 注意事项:此函数配置为外部时钟,定时器相当于计数器
*/
void PWM_Init(void)
{
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
/*GPIO初始化P0口*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;;
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置时钟源*/
TIM_InternalClockConfig(TIM2); //选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
/*时基单元初始化*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseIn