一、直流电压有效值
电压的有效值是多少?
最近遇到好多问题,都与基本概念相关。忍不住,就想多说几句。
研究生面试,我出了一个问题,一个100kHz的方波信号,幅度大约是几伏的数量级,想测量其有效值,用什么仪器,怎么测?多数学生一脸茫然,搞的我不好意思,惭愧题目是不是太难了。我急了,问学生,一个1.5V的电池,其电压有效值是多少?学生问我,直流量有有效值吗?我忍。我不得不忍。
什么是有效值?一个变化电压的有效值,是指把它加载到一个确定的阻性负载上,在一个周期内的功,与电压为A的直流量作用在相同的负载上,在等长时间内的功相同,那么该变化电压的有效值就是A。广义理解,一个电池的电压有效值就是1.5V,一个幅度为A的方波,如果是单极性方波,占空比50%,有效值为幅值A的0.707倍。这时候,又有人问我,什么是方波啊?
以前的一个学生,参与的一个题目,用一个10欧姆电阻把一个待测的1uA左右的电流转变成10uV左右的电压,然后用AD620和多级直流放大进入ADC,却发现输出总有很大的偏移量。于是就买了好些个放大器,挑选,想让偏移量小些。查查资料就知道,AD620A级的输入失调电压典型值为30uV,最大值为125uV,已经远大于被测信号10uV。至少应该知道,此处使用被大家广为推崇的AD620是不靠谱的。
但是,设计者就是不知道这个道理。
昨晚我的学生来聊天,问我,学这些基础有用吗?其实,不用问我,问问歌唱演员就可以了,问他们,吊嗓子重要吗?问问厨师,刀工重要吗?
现阶段,很多比赛都是些花里胡哨的作品,很吸引眼球,功能也很强悍。但是面对这些竞赛的孩子,你就是不能问他们问题,一问就露馅了——底子很薄,但成果很强。就像以“满汉全席”夺得厨师大赛冠军一样,回家后做不好一个炒土豆丝。
所以,我特别希望能多一些比赛,就赛那些基础的东西。比如12V电源,谁能做出动态范围最大的单管放大器,或者做一个最准的电子秤,就比这些指标。噪声最小、频带最宽、带内最平坦、失真度最小、温度稳定性最好等等,可以研究的东西很多。
但很遗憾,谁也不会对此感兴趣。就比赛一个放大器,外行看起来一点都不拉风,没劲透顶了。
可是看看身边现状,看看某些日益堕落的教师和学生,好大喜功的媒体,谁能救救我们的基础教育,谁能把孩子们拉回来,静静地在实验室做一些看似枯燥,却蕴含玄机的实验?
下面科普基本概念
一、基本概念:
交流电的有效值:
在相同的电阻上分别通以直流电流和交流电流,经过一个交流周期的时间,如果它们在电阻上所损失的电能相等的话,则把该直流电流(电压)的大小作为交流电流(电压)的有效值,正弦电流(电压)的有效值等于其最大值(幅值)的0.707倍。
交流电的平均值:
对于交流电来说,数学上的平均值是0(因为是正负是对称的)。但电工技术上我们关心的是其量值(绝对值)的大小。所以电工技术上的平均值指的是电流(电压)的绝对值在一个周期内的平均值。
二、例子:
1、10V的直流电压加在10Ω电阻的两端,电阻的发热功率是多少?
这个答案很简单,坛里所有的朋友都会:P=U×U/R=10V×10V/10Ω=10W
2、如果把上面的10V直流电压改成下图±10V的方波呢,电阻的发热功率又是多少?
答案是否也不难?因为负半周时电压的平方和正半周时是一样的,所以功率也和上面一样还是10W!
电压是负的功率还是正的,也就是功率和电压的正负无关。
图中红色部分是正半周做的功,蓝色部分是负半周作的功。
问:这个±10V的方波电压的平均值是多少?有效值是多少?峰值是多少?
根据上面的定义,很明显:
①平均值是10V(其电压的绝对值在一个周期内的平均值是10V);
②有效值是10V(发热功率相同的等效直流电压是10V);
③峰值是10V
3、如果把上面的方波去掉负半周部分(也就是+10V方波),那电阻上的功率又会是多少呢?
很明显,只有一半时间在做功,从宏观上看其平均功率只有一半了,也就是5W!
同问:这个+10V的方波电压的平均值是多少?有效值是多少?峰值是多少?
根据上面的定义,很明显:
①平均值是5V(其电压的绝对值在一个周期内的平均值是5V);
②有效值是7.07V:(发热功率相同的等效直流电压是:U^2=PR=5W×10Ω,U=根号50≈7.07V);
③峰值是10V
可见:去掉负半周后其电压的平均值是原来的一半,而有效值并不是原来的一半,而是原来的0.707倍!峰值不变。
以上为了便于理解,用了方波做例子计算。
如果用正弦波,那么就需要有高等数学的微积分知识,对于某些朋友可能理解困难。
事实上为什么正弦交流电的峰值和有效值之间是根号2倍的关系,以及平均值之间的关系等都是通过积分计算得出的,对于非正弦波其关系就不一定相同了,所以千万别乱套用。
对于正弦波现在我们可以用有效值相同的方波去等效,那么也可以得出这样的结论:半波整流后的电压有效值是整流前的有效值的0.707倍,而并不是有些朋友理解的一半。
二、SMT32的HEX文件里加入固件版本的方法
使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。
代码
代码如下:
延庆川北小区45孙老师 收卖废品破烂垃圾炒股 废品孙 再回收
//------------------------------------------------------------------------------
#include <absacc.h>
//------------------------------------------------------------------------------
#define VERINFO_ADDR_BASE (0x8009F00) // 版本信息在FLASH中的存放地址
const char Hardware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00))) = "Hardware: 1.0.0";
const char Firmware_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x20))) = "Firmware: 1.0.0";
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;
//------------------------------------------------------------------------------
写入到程序中:
选项配置中:Flash地址与大小不用做任何修改!
HEX文件:
串口打印输出:
上述方法的缺点
上述操作可行, 但是有一个缺点:就是生成的bin文件都是满flash大小的, 造成每次烧录都是整个flash读写。相关文章:详解STM32在线IAP升级。
其实这个可以把存放地址放到前面,比如偏移1K的地方,都不用改指定地址。
按照上述操作,程序末尾到VERINFO_ADDR_BASE地址这一段会被填充成0x00。根据需要可以修改VERINFO_ADDR_BASE减小地址,或者说不强制指定地址,由编译器自动分配,但这样就要去找相应的版本标识字符串了。
优化方法
不想前面这一段被大量填充0x00,让HEX文件体积小一点的话, 可以把选项配置中Flash的Size改小一点,把VERINFO_ADDR_BASE设置成从FlashSize后面的空间开始,这样生成的HEX文件就小了,且未用空间就不会被大量填充0x00了。
方法如下: