历史上的今天
返回首页

历史上的今天

今天是:2024年09月28日(星期六)

2021年09月28日 | stm32f103呼吸灯(PWM脉冲宽度调制)

2021-09-28 来源:eefocus

一、PWM脉冲宽度调制

1、使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,见图

在这里插入图片描述

要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。在下边编程实现中会详细说明。


2、要改变PWM输出波形的宽度,就要改变比较寄存器 CCRx 的值,想要输出不通宽度来拟合正弦波,则需要CCRx的值呈现如下图的变化趋势,即要生成一张CCRx的数值表,按周期变化将表中元素的值赋给CCRx。

在这里插入图片描述

二、硬件说明

本文所使用硬件为野火的stm32f103指南者开发板,LED使用PB5引脚控制的红色LED


三、编程实现

利用野火提供的呼吸灯例程说明


1、硬件相关宏定义

bsp_breathing.h 文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

定义了三组LED的宏,通过修改代码中的 #define LIGHT_COLOR RED_LIGHT语句,可以切换使用红、绿、蓝三种颜色的呼吸灯。 在每组宏定义中,定义了定时器编号、定时器时钟使能、红灯中PB5引脚重映射操作、GPIO 端口和引脚号、通道对应的比较寄存器名以及中断通道和中断服务函数名。 定时器的比较寄存器 CCRx 在控制呼吸灯的单个周期内需要切换为 PWM表中不同的数值,所以需要利用定时器中断。


2、GPIO初始化

bsp_breathing.c 文件

在这里插入图片描述

野火的库封装度比较高,所以使用的都是宏定义名,在上面的硬件配置中启用不同的宏,便会对应不同的管脚。其中由于红灯使用的引脚需要用到第二功能,本代码 使用宏 BRE_GPIO_REMAP_FUN ()进行了该引脚的功能重定义操作


3、定义 PWM表

PWM表则是一个周期内比较寄存器CCRx的变化值,即脉冲宽度的变化值。

bsp_breathing.c 文件

在这里插入图片描述

此表用以下python代码生成


#! python3

#coding=utf-8


"""

Python版本:3.x

外部库:matplotlib1.5.3、numpy1.11.2


运行结果:

命令行中会打印计算得的各点数据,

在当前目录下会生成py_index_wave.c文件,包含上述数据,

并且会弹出描绘曲线的对话框。

"""


import matplotlib.pyplot as plt 

import numpy as np

import math


#修改本变量可以更改点数,如16、32、64等

POINT_NUM = 110


#指数曲线最大为2的MAX_POWER次方

MAX_POWER = 10


# POINT_NUM 个点

x1 = np.linspace(0,MAX_POWER,POINT_NUM/2)


#f = 2^(x)

up =[]

for i in x1:

    temp = round(2**i)

    #得到升序列

    up.append( temp )

   

x2 = np.linspace(MAX_POWER,2*MAX_POWER,POINT_NUM/2)


#f = 2^(2*MAX_POWER-x)

down=[]

for i in x2:

    temp = round(2**(MAX_POWER*2-i))


    #得到降序列

    down.append( temp )


line = list(x1)+list(x2)

val = list(up)+list(down)



print(line)

print("*"*80)

print(list(map(int,val)))


#写入序列到文件

with open("py_index_Wave.c",'w',encoding= 'gb2312') as f:

    print(list(map(int,val)),file= f)


#绘图

plt.plot(line,val,"-o")

plt.show()


该 python脚本生成 PWM表数据的原理,实质是按照如下函数曲线进行采样:

若 0<= x <=10:

y = 2^x

若 10< x <=20:

y = 2^(20−

推荐阅读

史海拾趣

GE Oil & Gas Digital Solutions公司的发展小趣事
在生产线上对电阻元件进行快速筛选和分类。
ETTINGER公司的发展小趣事

Ettinger与英国著名汽车品牌Bentley建立了长期合作伙伴关系。作为Bentley汽车皮件配饰和皮具产品的指定供应商,Ettinger为Bentley提供了高品质的皮具产品,进一步提升了品牌的知名度和影响力。这种合作伙伴关系的建立,也为Ettinger带来了更多的商业机会和发展空间。

American Power Devices Inc公司的发展小趣事

在电子行业的初期,APD公司凭借其卓越的技术研发团队,成功开发出了一款高效能的电源管理芯片。这款芯片以其低能耗、高稳定性等特点迅速获得了市场的认可。随着技术的不断迭代和更新,APD持续投入研发,推出了一系列具有竞争力的产品,逐渐在电源管理领域树立了领先地位。

CHERRY公司的发展小趣事

随着业务的不断发展,Cherry将目光投向了更广阔的市场。1967年,随着个人计算机的普及,Cherry看到了键盘市场的巨大潜力,于是决定引进键盘生产线。不久之后,Cherry建造了世界上第一个键盘工厂,开始生产高质量的键盘产品。这一决策为Cherry公司后来的发展奠定了坚实的基础。

申风(everanalog)公司的发展小趣事

随着技术实力的不断提升和产品线的日益丰富,申风(everanalog)公司开始积极拓展市场。公司凭借优质的产品和服务,逐渐在国内市场上树立了良好的品牌形象。同时,公司也积极开展国际合作,与国际知名企业建立了战略合作关系,共同推动集成电路产业的发展。这些合作不仅为公司带来了更多的商业机会,也提升了公司在国际市场上的竞争力。

FOTEK公司的发展小趣事

随着业务的不断拓展,福禄克意识到全球化布局的重要性。1970年代,公司在英国设立了首个海外生产基地,随后又在荷兰和中国等地建立工厂。这一系列举措不仅降低了生产成本,还使福禄克能够更贴近全球市场需求,提供更加快速和灵活的服务。同时,福禄克在全球范围内建立了广泛的销售和服务网络,进一步巩固了其市场地位。

问答坊 | AI 解惑

ATM监控专业评标标准!!!

ATM监控专业评标标准!!! 资质审查1. 数字录像设备和微型摄像机同时获得公安部安全防范报警系统产品质量监督检验测试中心出具的型式检验报告。 依据标准: A. 公安部关于贯彻实施《安全技术防范产品管理办法》有关问题的补充通知第二条 B. 《 ...…

查看全部问答>

开发板mount 不上PC机

使用是HHARM2410的开发板。NFS服务器配置操作是正确的,PC与开发板之间相互能ping通,但是开发板正常启动后mount 不了PC机。我已经关了防火墙。我主机IP为192.168.2.222。/etc/exports文件设置的是(rw)。在minnicon里执行mount 192.168.2.222:/ /m ...…

查看全部问答>

GSM AT命令 查询手机卡余额

兄弟们,我想做一个GSM短信模块,不知道查询手机卡余额是什么,有人做过吗…

查看全部问答>

vxWorks的etherOutput()是可重入的吗?

vxWorks的etherOutput()是可重入的吗? 似乎从内存池中取内存块没有做保护。…

查看全部问答>

16位的80186微处理器与8位NVRAM之间地址线互连的一个问题

    16位80186与8位NVRAM之间互连只能以地址线A1对其A0,CPU本身的A0与NVRAM不连接。     有谁知道为什么。…

查看全部问答>

兄弟们推荐一 自动增益控制 电路(AGC)的片子 谢谢啦

      单位要设计了 一电压过零检测电路   需要从几毫伏 到几伏之间 频率小于1khz 的 电压中检测出零点  ,一直很迷茫  我的设计大致步骤如下  希望各位大侠帮帮我信号  经AGC放大到5伏     ...…

查看全部问答>

如何申请STM32样片(做电机控制用)代替2406??

                                 如何申请STM32  样片(做电机控制用)代替2406??…

查看全部问答>

求助:Spartan-605 FPGA 怎样外接硬盘

Spartan-605 FPGA 怎样外接硬盘,感觉sp605的开发板上好像没有接硬盘的接口,求助!!!…

查看全部问答>

verilog的一个语法问题

verilog中,一个always中如果含有好几个case语句,那么这些case语句是并发执行,还是顺序执行呢??如下 always begin case(a)    ………… case(b)    ………… case(c)    ………… end  …

查看全部问答>

MSP430G2553串口连接12864显示,只用连接三个引脚,大大节省资源

#include <msp430g2553.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longunsigned char a[]={\"波天神终于把12864学会了!\"};#define SID  BIT1#define SCLK BIT2#define CS   BIT3#define ...…

查看全部问答>