STM32利用标准库的方式输出PWM(proteus仿真)

首先打开proteus仿真软件,绘制电路图:

其中示波器的添加很简单的,看图:

再来看看咱们最后程序的效果:

下面就是程序代码了,新建两个文件PWM.c和PWM.h文件,所属关系如图:

整个的编程思路就是:

第一步:RCC开启时钟,把我们要用 的TIM外设和GPIO外设的时钟打开

第二步:配置时基单元

第三步:配置输出比较单元

第四步:配置GPIO口,初始化为复 用推挽输出的配置

第五步:运行控制,启动计数器。

需要用到的引脚定义图,并不是每一引脚都能输出PWM的,要看引脚上有没有这个功能或是复用功能:

另外总结了一下PWM设置相关的函数,如图:

另外就是PWM的频率,占空比,分辨率的计算方法:

具体程序中的计算方法,如图:

好了PWM.c的程序:

cs 复制代码
#include "stm32f10x.h"                  // Device header




void PWM_Init(void)
{

	//第一步:RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//第二步:配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStruct.TIM_Period = 100-1;
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	//第三步:配置输出比较单元
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
	
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_Pulse = 0;
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	//第四步:配置GPIO口,初始化为复用推挽输出的配置
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	//第五步:运行控制,启动计数器。
	TIM_Cmd(TIM2, ENABLE);
	
	
}


//这个函数就是设置比较器CCR的值,以达到实时控制占空比的目的
void SET_Compare(uint16_t num)
{
	TIM_SetCompare1(TIM2, num);
}

PWM.h的程序:

cs 复制代码
#ifndef __PWM_H
#define __PWM_H

void PWM_Init(void);

void SET_Compare(uint16_t num);

#endif

main.c的主程序:

cs 复制代码
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Delay.h"
#include "PWM.h"

uint16_t i=0;
int main(void)
{
	OLED_Init();       //oled  屏幕初始化
	PWM_Init();
	
	while(1)
	{
		for(i=0; i<100; i++)
		{
			SET_Compare(i);
			Delay_ms(10);
		}
		for(i=0; i<100; i++)
		{
			SET_Compare(100-i);
			Delay_ms(10);
		}
	}
}

整个过程是用不到OLED的,我没有把初始化代码删掉,是为了如果想查看一些变量的值的话,用OLED显示出来,会很方便的。还有一个原因是这个工程代码是复制了OLED显示的工程而来,懒得删了,就留下了。程序中用到了延时两个延时文件要有,整个工程的代码文件我之前分享过,没有的可以去我之前的文章找下载链接,复制改名就ok了。

相关推荐
国科安芯3 小时前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计3 小时前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件
CiLerLinux10 小时前
第四十九章 ESP32S3 WiFi 路由实验
网络·人工智能·单片机·嵌入式硬件
时光の尘10 小时前
【PCB电路设计】常见元器件简介(电阻、电容、电感、二极管、三极管以及场效应管)
单片机·嵌入式硬件·pcb·二极管·电感·三极管·场效应管
Lu Zelin10 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
宁静致远202111 小时前
stm32 freertos下基于hal库的模拟I2C驱动实现
stm32·嵌入式硬件·freertos
Wave84515 小时前
STM32--智能小车
stm32·单片机·嵌入式硬件
wdfk_prog18 小时前
[Linux]学习笔记系列 -- lib/timerqueue.c Timer Queue Management 高精度定时器的有序数据结构
linux·c语言·数据结构·笔记·单片机·学习·安全
helesheng20 小时前
用低成本FPGA实现FSMC接口的多串口(UART)控制器
stm32·fsmc·fpga·uart控制器
充哥单片机设计21 小时前
【STM32项目开源】基于STM32的智能家居环境(空气质量)检测系统
stm32·单片机·嵌入式硬件