标题: 开源基于STC单片机内部基准mini电压表—极简设计创新制作 [打印本页]

作者: 刘海龙    时间: 2016-10-20 15:32
标题: 开源基于STC单片机内部基准mini电压表—极简设计创新制作
开源基于STC单片机内部基准(Bandgap voltage reference)mini电压表—极简设计创新制作
1.hello-坛友们大家好!今天开源制作一款9.99v量程的电压表(改变一下电阻和程序可以改为更大量程),只需要单片机数码管电阻三种4个元件(没有用到TL431之类的外接基准芯片),极简设计精简制作。感觉赞的话在评论区留个评论,谢谢支持,大家的支持就是我发帖的最大动力。
2.利用STC单片机STC15W408AS内部自带的基准电压Bandgap voltage reference)最为参考电压,用ADC测量出外部输入的电压。
3.昨晚奋斗到凌晨把程序改好,今天画了原理图,拍了照片。(发帖是一件辛苦的活,请评论一下帖子顺便赞)
4.Bandgap voltage reference,常常有人简单地称它为Bandgap。最经典的带隙基准是利用一个与温度成正比的电压与一个与温度成反比的电压之和,二者温度系数相互抵消,实现与温度无关的电压基准,约为1.25V。因为其基准电压与硅的带隙电压差不多,因而称为带隙基准。实际上利用的不是带隙电压。现在有些Bandgap结构输出电压与带隙电压也不一致。(来自百度百科的解释)
图片中没有测别的电源电压,测量的是USB的供电电压


mini电压表测出来的是4.75v 万用表测出来的是4.76v


下图为在实验板上的布局先插入电阻‘’插座、单片机


数码管直接压在单片机上插入实验板(焊接过程自行脑补)


下图为PADS画的原理图,附件中有原版。


看过留个评论谢谢!
  1. /********************************************/
  2. //2016.10.20日 1:01编写完成
  3. //作者:刘海龙 (读单片机内部BandGap基准电压值参考的STC官网程序)
  4. //硬件:STC15W408AS+3位共阴数码管+2个10K的电阻(1/4w)
  5. //晶振无说明的情况选12M
  6. //测量口P1.7
  7. #include <STC15W.h>
  8. #include <intrins.h>
  9. #include<4LED_YIN.H>//数码管驱动显示程序
  10. #include <BandGap.H>//包含读单片机内部BandGap基准电压值        
  11. /********************************/
  12. void main (void)
  13. {        Delay20ms();//待系统稳定
  14.     InitADC();//初始化ADC
  15.     P1M1=0X80;//P1.7高阻输入
  16.         init();//IO口设置初始化
  17.     while (1)
  18.     {
  19.         ShowResult(7);//显示通道P1.7的测量值、单位为毫伏
  20.                 disp();        //数码管显示电压值
  21.     }
  22. }
复制代码





ADC极简电压表.rar

910.9 KB, 下载次数: 1530, 下载积分: 黑币 -5

原理图+源程序


作者: 刘海龙    时间: 2016-10-20 16:39

下载时要勾选图片中红色圈内的选项

作者: taoran    时间: 2016-10-20 19:52
电路还是很简洁的,stc的内部基准不知道精度怎么样。先收藏备用了,对了楼主你那个原理图还漂亮 请教下是用什么软件做的啊?
作者: 刘海龙    时间: 2016-10-20 21:13
taoran 发表于 2016-10-20 19:52
电路还是很简洁的,stc的内部基准不知道精度怎么样。先收藏备用了,对了楼主你那个原理图还漂亮 请教下是用 ...

用的PADS9.5画的
作者: 1123212143255    时间: 2016-11-3 04:02
做出来了,引脚可以任意改,非常好用。
作者: 尚尚网    时间: 2016-11-3 14:50
这个做和不错。
作者: Y!NG    时间: 2016-11-15 10:44
并没有sch原理图,,。
作者: Y!NG    时间: 2016-11-15 10:45
尚尚网 发表于 2016-11-3 14:50
这个做和不错。

你下载的文件有原理图么,有的话邮一份1218946827  企鹅
作者: 尚尚网    时间: 2016-11-15 16:18
Y!NG 发表于 2016-11-15 10:45
你下载的文件有原理图么,有的话邮一份1218946827  企鹅

我看过删了。
作者: 尚尚网    时间: 2016-11-15 16:19
Y!NG 发表于 2016-11-15 10:45
你下载的文件有原理图么,有的话邮一份1218946827  企鹅

http://c.51hei.com/d/forum/201610/20/152000q1w7oikbv1bo2oek.png
上面不上有吗?
作者: 春风秋叶    时间: 2016-11-15 17:05
感谢楼主分享
作者: 刘海龙    时间: 2016-11-15 17:35
Y!NG 发表于 2016-11-15 10:44
并没有sch原理图,,。

有的,你解压出来后有个ADC.sch文件就是,之前是手工画的图,后来改成电脑画的了。
作者: 70700    时间: 2016-11-18 16:03
顶一顶,下载
作者: wasen    时间: 2016-11-18 16:27
这是好东西啊,收藏起来先。。。
作者: 越快乐越堕落    时间: 2016-11-20 21:32
Y!NG 发表于 2016-11-15 10:45
你下载的文件有原理图么,有的话邮一份1218946827  企鹅

上面有图直接复制一份不就好了 又不需要你改
作者: 越快乐越堕落    时间: 2016-11-20 21:33
只有我一个人觉得很浪费吗???那么多IO口都没用。不知道精度怎么样
作者: somlye    时间: 2016-11-25 21:01
很好,收藏了!
作者: cnz    时间: 2017-1-16 08:20
非常棒,我也要学着做一个装在电源上。
作者: zmmatlll    时间: 2017-3-21 19:59
顶贴了,下载下来看看,嘿嘿
作者: xiaoxiao///    时间: 2017-3-27 15:35
求附件内容
作者: hxc888    时间: 2017-3-30 22:23
正好学习,能邮到,O(∩_∩)O谢谢
作者: nnq    时间: 2017-4-20 19:53
精简的设计,精度0.5mv吗
作者: 刘海龙    时间: 2017-4-21 12:18
nnq 发表于 2017-4-20 19:53
精简的设计,精度0.5mv吗

精度没有那么高,两个分压电阻也有误差的。
作者: oosheoo    时间: 2017-4-24 22:04
这个的顶起来啊,这么好的源码
作者: 越快乐越堕落    时间: 2017-4-29 18:54
怎么修改测量范围?具体办法是?
作者: 刘海龙    时间: 2017-4-30 23:03
越快乐越堕落 发表于 2017-4-29 18:54
怎么修改测量范围?具体办法是?

两个电阻串联分压原理,改变两个电阻的比值可以改变分压多少,从而改变量程。
作者: 越快乐越堕落    时间: 2017-5-2 18:50
刘海龙 发表于 2017-4-30 23:03
两个电阻串联分压原理,改变两个电阻的比值可以改变分压多少,从而改变量程。

程序如何修改呢
作者: 刘海龙    时间: 2017-5-2 22:34
越快乐越堕落 发表于 2017-5-2 18:50
程序如何修改呢

具体修改方法见图片

21.png (19.37 KB, 下载次数: 438)

21.png

作者: huyin    时间: 2017-5-3 16:27
很好,不错学习下。
作者: 山中人家    时间: 2017-5-3 17:41
赞一个,给力
作者: 越快乐越堕落    时间: 2017-5-4 11:11
刘海龙 发表于 2017-5-2 22:34
具体修改方法见图片

这样就可以了?数码管的百位会不会乱码?是继续用三位数码管吗?如果是,那么小数点的位移怎么解决?比如测的电压为30.5v时。
作者: 人工智能威力    时间: 2017-5-4 14:55
刘海龙 发表于 2017-5-2 22:34
具体修改方法见图片

我理解能力有问题!一直很蒙你直接说量程到30V要怎么修改这样好明白一点
作者: 刘海龙    时间: 2017-5-4 22:32
本帖最后由 刘海龙 于 2017-5-4 22:39 编辑
人工智能威力 发表于 2017-5-4 14:55
我理解能力有问题!一直很蒙你直接说量程到30V要怎么修改这样好明白一点

电阻R2改为2k,程序中的v=v*2改为v=v*6显示程序也需要改为下面的这样/******************显示程序*************************/
void disp(){
unsigned int i;
        for(i=0;i<50;i++){
                diplay_data (1,disdata[v/10000]);
                diplay_data (2,disdata[v%10000/1000]+0x80);
                diplay_data (3,disdata[v%1000/100]);
        }
}


作者: 刘海龙    时间: 2017-5-4 22:38
越快乐越堕落 发表于 2017-5-4 11:11
这样就可以了?数码管的百位会不会乱码?是继续用三位数码管吗?如果是,那么小数点的位移怎么解决?比如 ...

/******************显示程序*************************/
void disp(){
unsigned int i;
        for(i=0;i<50;i++){
                diplay_data (1,disdata[v/10000]);
                diplay_data (2,disdata[v%10000/1000]+0x80);
                diplay_data (3,disdata[v%1000/100]);
        }
}
作者: 越快乐越堕落    时间: 2017-5-5 14:05
刘海龙 发表于 2017-5-4 22:38
/******************显示程序*************************/
void disp(){
unsigned int i;

还请详细说一下,我不太懂你的意思,谢谢
作者: XDDZ1013    时间: 2017-5-12 21:52
谢谢分享,学习一下
作者: XDDZ1013    时间: 2017-5-12 21:54
下载学习学习
作者: 强如我葱    时间: 2017-5-28 14:23
电压变化公式是什么
作者: 强如我葱    时间: 2017-5-28 17:20
学习一下
作者: 强如我葱    时间: 2017-5-28 17:20
很好,值得分享
作者: 啦啦拉    时间: 2017-6-8 20:38
受教了,以前还不知道bandgap是什么
作者: 1qaz2wsx77    时间: 2017-6-9 07:37
学习了
作者: XDDZ1013    时间: 2017-6-9 21:41
单片机用STC12C5204AD可以吗?头文件要不要改?
作者: ytechcn    时间: 2017-6-13 17:23
你好,请教下,这个编译时怎么会显示警告的。
#if (MAIN_Fosc >= 24000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_30MHZ
#elif (MAIN_Fosc >= 20000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_24MHZ
#elif (MAIN_Fosc >= 12000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_20MHZ
#elif (MAIN_Fosc >= 6000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_12MHZ
#elif (MAIN_Fosc >= 3000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_6MHZ
#elif (MAIN_Fosc >= 2000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_3MHZ
#elif (MAIN_Fosc >= 1000000L)
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_2MHZ
#else
        #define                ISP_WAIT_FREQUENCY        ISP_WAIT_1MHZ
#endif

作者: ytechcn    时间: 2017-6-13 17:51
大神,求指教下你这个程序编译时出现这个警告,我要注意什么问题吗?还是我哪里出错了:
Build target 'Target 1'
compiling STC15ADC.c...
STC15W.h(526): warning C322: unknown identifier
STC15W.h(528): warning C322: unknown identifier
STC15W.h(530): warning C322: unknown identifier
STC15W.h(532): warning C322: unknown identifier
STC15W.h(534): warning C322: unknown identifier
STC15W.h(536): warning C322: unknown identifier
STC15W.h(538): warning C322: unknown identifier
linking...
Program Size: data=22.0 xdata=0 code=1674
creating hex file from "STC15内部基准测量电压程序"...
"STC15内部基准测量电压程序" - 0 Error(s), 7 Warning(s).
作者: join22life    时间: 2017-8-17 10:22
非常感谢  学习中
作者: erzhu2007    时间: 2017-8-17 12:02
嘿,楼主强大,虾虾弄
作者: 刘海龙    时间: 2017-9-19 23:15
ytechcn 发表于 2017-6-13 17:23
你好,请教下,这个编译时怎么会显示警告的。
#if (MAIN_Fosc >= 24000000L)
        #define                ISP_WAIT_FREQUEN ...

把这些信息删除就好了,不影响程序运行。
作者: king_zxt    时间: 2017-9-20 13:46
赞一个
作者: lzptt    时间: 2017-9-20 15:01
好文,必须收藏,赞一个
作者: join22life    时间: 2017-9-21 17:01
再看了一次,受教了,非常感谢,找时间也做个
作者: hclin    时间: 2017-9-26 01:25
very good, nice job !!!
作者: lsrly    时间: 2017-9-28 22:04
我改用共阳数码管,怎么两个数码管同时显示,可以讲一下数码管点扫描的原理吗?就是你这个数码管动态显示的原理,谢谢
作者: 刘海龙    时间: 2017-9-28 22:37
lsrly 发表于 2017-9-28 22:04
我改用共阳数码管,怎么两个数码管同时显示,可以讲一下数码管点扫描的原理吗?就是你这个数码管动态显示的 ...

看程序中的数码管底层驱动函数4LED_Y.H
作者: lsrly    时间: 2017-9-29 20:58
刘海龙 发表于 2017-9-28 22:37
看程序中的数码管底层驱动函数4LED_Y.H

看了,只是还不太了解这个时间是多少
作者: KDQ10328    时间: 2017-10-4 16:39
谢谢,正想学习仿制一个
作者: yao16811    时间: 2017-10-5 11:19
这个非常实用,代码收藏了!
作者: lhuijiang    时间: 2017-10-13 08:34
电路和程序都很简洁。
作者: lsrly    时间: 2017-10-17 21:55
这个怎么增加平均值,也就是取十次戓更多次
作者: jmkl128    时间: 2017-10-31 05:03

很好,值得分享
作者: lemon0210    时间: 2017-10-31 10:36
感谢楼主分享
作者: 刘海龙    时间: 2017-11-5 21:02
lsrly 发表于 2017-10-17 21:55
这个怎么增加平均值,也就是取十次戓更多次

百度搜索ADC平均值滤波法
作者: pgdw    时间: 2017-11-18 09:44
stc的单片机还是很不错的,感谢楼主无私分享。
作者: criman    时间: 2017-11-18 09:56
您好楼主,请问如何我用段式lcd如何代替您文中的三位数码管
作者: fly_apple    时间: 2017-11-20 15:06
刚开始学习,谢谢
作者: fly_apple    时间: 2017-11-20 15:08
刚开始学习单片机,正好用这个练练手,谢谢楼主。
作者: criman    时间: 2017-11-25 16:23
电压跳动比较大怎么解决?
作者: jmkl128    时间: 2017-12-4 17:09
感谢开源,按照楼主的图和程序作了一个,用的是16脚的单片机,不错!
作者: 爱喝柠檬水    时间: 2017-12-5 12:16
感谢分享
作者: 苏大胡工    时间: 2017-12-11 09:02
好贴,学习了,试着用用
作者: xingyusky111    时间: 2017-12-11 13:03
看看,学习下
作者: iloveplc    时间: 2017-12-13 12:39
这个电压表超级简单,楼主的思维不一般啊,用到了MCU内部的基准电压,赞!
作者: 功夫崽崽    时间: 2018-1-5 09:55
学习!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: zhengguangxi    时间: 2018-1-19 22:49
不错的东西
作者: jizi    时间: 2018-1-23 12:56
赞一个
作者: 更深的蓝色    时间: 2018-1-30 18:49
学习了
作者: advantech    时间: 2018-1-31 09:39
很好,值得分享
作者: 51hejerry    时间: 2018-1-31 14:37
看起來還不錯簡單,先下載備用,謝謝!
作者: zzg731010    时间: 2018-2-8 14:34
我的分数不够,不知能不能下载来学习下
作者: ccxdtrj    时间: 2018-2-8 20:41
很好,收藏一下下
作者: 刘海龙    时间: 2018-2-8 21:42
criman 发表于 2017-11-25 16:23
电压跳动比较大怎么解决?

用中位数滤波法或平均值滤波法
作者: liding12356    时间: 2018-2-9 11:11
这资料不错  感谢楼主

作者: madell    时间: 2018-2-13 10:44
非常不错!程序写得很清楚
作者: zhengyu233    时间: 2018-3-8 10:29
简单明了
作者: kkfy888    时间: 2018-3-14 00:31
谢谢分享!
作者: tangyufei12    时间: 2018-3-14 10:04
希望对我有用
作者: my51hsharks    时间: 2018-3-14 17:52
谢谢分享,学习一下
作者: jkt401    时间: 2018-3-29 16:36
谢谢分享,学习一下
作者: nb_kk    时间: 2018-4-18 15:52
很好,值得分享
作者: mengsiu    时间: 2018-4-18 18:37
很简洁的设计。学习了。
作者: longwu4886    时间: 2018-4-19 09:22
下载学习学习,谢谢,感谢分享!!!!!!
作者: longwu4886    时间: 2018-4-19 10:43
power_voltage=(float)bandgap*1024/adc_9gallery_res;
1024是什么的,为什么要乘以1024
作者: oyxx134    时间: 2018-4-25 12:36
8位255  10位1024  12位4095 不知道我说得对不对
作者: lucheng77    时间: 2018-4-25 18:44
不错,收藏一下,以前真还不知道bandgap是什么。
作者: 刘海龙    时间: 2018-5-24 21:35
oyxx134 发表于 2018-4-25 12:36
8位255  10位1024  12位4095 不知道我说得对不对

说的对,STC15W408AS单片机内部自带ADC是10位的2的10次方就是1024
作者: zhongxing138    时间: 2018-6-11 14:29
还没有做 看看能不能用
作者: zhongxing138    时间: 2018-6-11 14:31
看来楼主对这一块也花了不少心思去研究,在没有人教的情况下,自己去摸索,赞!
作者: lj820220    时间: 2018-6-25 00:16
学习了
作者: yzyjkcs    时间: 2018-6-26 18:42
赞一个!
作者: kiww    时间: 2018-6-26 21:40
好好学习,天天向上




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1