一、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−
上一篇:STM32F103入门 | 12.PWM实现呼吸灯
下一篇:基于STM32的PWM呼吸灯系统设计
推荐阅读
史海拾趣
对于快速充电IC(bq2002)电路,网友可能还会有多种问题,以下是一些常见问题及其回答:
一、电路设计相关问题
- BQ2002的BAT引脚如何正确接入电池电压?
- 回答:BQ2002的BAT引脚用于接收电池电压的取样信号。通常,电池电压会经过一个电阻分压网络后接入BAT引脚,以确保BQ2002能够正确检测电池电压。电阻分压网络的输入电阻不应小于200kΩ,以避免对电池电压造成过大影响。
- 如何设置BQ2002的充电速率?
- 回答:BQ2002的充电速率可以通过TM引脚进行设置。当TM引脚接地时,充电速率为1C(即电池容量的1倍)。此外,根据数据手册,TM引脚的不同电平还可能对应不同的充电速率,如C/2或2C,但具体设置需参考具体的数据手册或应用指南。
- BQ2002的CC引脚如何控制充电电流?
- 回答:BQ2002的CC引脚用于控制充电电流的开关,而不是直接调节充电电流的大小。CC引脚有两种状态:高阻态和接地态。当CC引脚为高阻态时,充电电流可以流动;当CC引脚接地时,充电电流被抑制。充电电流的大小通常由外部恒流源(如LM317等)的电阻设置决定,与CC引脚的状态无关。
二、功能实现与调试问题
- 为什么BQ2002没有进入快速充电模式?
- 回答:BQ2002没有进入快速充电模式可能由多种原因造成,如电池电压或温度不符合快速充电条件、TS引脚电压不在正常范围内、或外部电路设计问题等。建议检查电池电压和温度是否满足快速充电条件,同时检查TS引脚电压是否介于0.25VCC和0.4VCC之间(或1.25V和2.0V之间),并确认外部电路设计无误。
- BQ2002在充电过程中突然停止充电怎么办?
- 回答:BQ2002在充电过程中突然停止充电可能是由于电池过热、电池电压过高或外部电路故障等原因造成的。建议检查电池温度是否过高,电池电压是否超出BQ2002的承受范围,并检查外部电路是否有短路或断路等故障。如果问题依旧存在,可能需要更换BQ2002芯片或重新设计外部电路。
- 如何调整BQ2002的充电截止电压?
- 回答:BQ2002的充电截止电压通常是通过外部电路设计来调整的。具体方法可能因电路设计而异,但一般可以通过调整与BAT引脚相连的分压电阻的阻值来改变BQ2002检测到的电池电压值,从而调整充电截止电压。需要注意的是,在调整充电截止电压时,应确保电池不会因过充而损坏。
三、其他常见问题
- BQ2002支持哪些类型的电池?
- 回答:BQ2002通常支持多种类型的可充电电池,如镍氢电池、锂离子电池等。但具体支持的电池类型可能因BQ2002的版本或制造商而有所不同。因此,在使用BQ2002进行电池充电时,应参考具体的数据手册或应用指南以了解支持的电池类型。
- BQ2002的功耗如何?
- 回答:BQ2002的功耗通常较低,但具体功耗值可能因工作条件(如输入电压、输出电流、环境温度等)的不同而有所变化。在设计电路时,应充分考虑BQ2002的功耗对系统整体性能的影响,并采取相应的措施来降低功耗。
以上是针对快速充电IC(bq2002)电路的一些常见问题及其回答。需要注意的是,由于BQ2002的具体应用可能因电路设计、电池类型等因素而有所不同,因此在实际应用中应参考具体的数据手册或应用指南以获取准确的信息。
EIC公司自创立之初,就致力于离散半导体技术的研发与创新。在成立初期,公司面临了技术瓶颈和市场接受度的双重挑战。然而,EIC的研发团队通过不懈努力,成功研发出了一款高性能、低功耗的离散半导体产品,这一技术突破不仅为公司赢得了市场认可,也为后续的产品线扩展奠定了坚实的基础。随着技术的不断进步和产品线的不断丰富,EIC逐渐在电子行业中树立起了自己的品牌形象。
在竞争激烈的电子组装市场中,一家名为“精准电子组装”的公司凭借其精准的市场定位脱颖而出。公司深入研究行业趋势和客户需求,准确把握市场脉搏,专注于为高端客户提供定制化的电子组装服务。通过不断挖掘客户需求、提升服务水平,精准电子组装在高端市场上占据了一席之地,实现了快速发展。
Dexter始终将技术创新作为企业发展的核心动力。公司不断投入研发资源,推动传感器技术的创新和发展。通过与高校、研究机构的合作,Dexter成功引入了多项新技术、新材料,并将其应用于产品中。这些创新产品不仅提高了传感器的性能和精度,还拓展了其应用领域。Dexter的创新精神引领了行业的发展方向,使其成为了行业的佼佼者。
与山东汇科电气技术有限公司不同,苏州汇科技术股份有限公司成立于2000年,是一家专业从事开发、设计、制造各式工业窑炉的技术型企业。公司位于江苏省常熟市辛庄工业开发区,凭借对技术的执着追求和对品质的严格把控,逐渐在行业中崭露头角。多年来,苏州汇科技术股份有限公司通过不断的技术创新和产品升级,赢得了客户的广泛认可和市场的信赖。
2010年,EnOcean公司成功成为国际标准组织ISO/IEC的成员。这一里程碑事件标志着EnOcean的技术和产品在全球范围内得到了广泛认可。通过参与制定无线传感网络的国际标准,EnOcean进一步巩固了其在行业内的领先地位,为推广其无线无源传输技术奠定了坚实基础。
我用AD7874做交流功率测量,想让功率稳定到小数后面的第3位,但是AD7874是12位的AD,跳动一个LSB就0.00488V了,所以小数后面第3位不跳动,但不知到怎样解决,请各位高手献策,在下先谢谢了!… 查看全部问答∨ |
涉及到电源的问题,请在这里提出。 quanzx与rockyltp在这里期待你的讨论。 quanzx:常在坛子里晃荡的网友可能发现,quanzx是像是一位非常热心的大哥,乐于 帮助大家,特别是 ...… 查看全部问答∨ |
我开始感觉应该是一样的,只是把default.hv的名字改成system.hv。 后来发现大小都不一样。 谁研究过类似的问题啊。。… 查看全部问答∨ |
|
ST-linkIII容易坏SN74LVC2T45DCUT好像该IC没什么必要? 我又坏了一个STLinkIII,经分析,又坏了SN74LVC2T45DCUT,(主芯片倒是很扎实,STM32好东东)。但经过分析(电路见附图),74lvc2t45 5脚接地的话传输方向是 B To A ,即目标板到STM32 。但这有必要吗?STM32 输入口只要串上限流电 ...… 查看全部问答∨ |
|
c语言-转移语句(continue/break/goto ) goto: goto 语句的作用是跳转到一条你指定的语句,然后从那条语句开始往下执行。goto 语句的用法很简单,首先在你想要跳往的语句前面加个标签和冒号: to: printf("go to here\\n"); 注意,标签的命 ...… 查看全部问答∨ |
1. 数字IO 1.1. Io分布 Figure 3 io分布图 从图上可以看出,msp430f149具有6组io,每个io均有两种功能。另外P1,P2两组io可以设置为外部中断与其对应了两个中断向量的入口。 1.2. I ...… 查看全部问答∨ |
各位大侠大家好,最近弄fpga,突然我的AS下载口不好使了呢,jtag调试与下载.jic文件都可以,AS十针下载口与fpga和epcs16(配置芯片)的引脚连接,我刚刚用万用表测试了一遍,连接也都没问题,不知道大家有没有遇到相同问题的朋友,AS也像jtag口那么 ...… 查看全部问答∨ |