切换到宽版
  • 4515阅读
  • 5回复

[STM]用stm8 ARDUINO 重写stm8 二线电压表程序 [复制链接]

上一主题 下一主题
离线huaweiwx
 

发帖
1372
M币
2167
专家
65
粉丝
297
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-04-14
新年大礼包:ARDUINO  STM8   发布: (一) 安装|http://bbs.mydigit.cn/read.php?tid=2362946
抽空断断续续基本把系统作了较大的调整,主要以下几个方面:
1 支持stm8全系列;
2 简化用户板定义,因此增加板子芯片非常方便;
3 对常用 的芯片进行测试;
在测试 stm8s003f3p6这款使用较多的芯片时,由于我手头没有该芯片,故想到抽屉里几年前买的两线3位电压表,根据坛友相关帖子介绍,主控就是stm8s003f3p6,焊上调试SWIM 和RST,就变成了开发板:

自上至下:
GND
VCC
SWIM
RST

我在sduino中增加了这个板子:


通过STLINK连接PC能正确识别,清除保护位后,就可以用sduino来开发了,但我们首先遇到的问题是:找不到电路图!
但我们可以有两个选择:
1 拆下数码管,把stm8所有引脚的连接情况测试出来;
2 写一个程序探测连接到数码管电压表用到的那部分引脚;
我选择了第二种方法,软件配合示波器探测,先看探测程序:(在我共享包中 Examples\examples\08.extend\testPin\testPin.ino)
  1. /*
  2.   testPin.ino 对每个脚翻转电平,通过示波器检测波形,探测引脚
  3.   for stm8s003f/103f 示例针对 stm8s003f/103f
  4.   
  5.   by huaweiwx@sina.com 2018.4.2
  6. */
  7. // the setup function runs once when you press reset or power the board
  8. void setup() {
  9.   // initialize digital pin LED_BUILTIN as an output.
  10.   pinMode(PA1, OUTPUT); //set all pins as OUTPUT 将所有脚设定为输出
  11.   pinMode(PA2, OUTPUT);
  12.   pinMode(PA3, OUTPUT);
  13.   pinMode(PB4, OUTPUT);
  14.   pinMode(PB5, OUTPUT);
  15.   pinMode(PC3, OUTPUT);
  16.   pinMode(PC4, OUTPUT);
  17.   pinMode(PC5, OUTPUT);
  18.   pinMode(PC6, OUTPUT);
  19.   pinMode(PC7, OUTPUT);
  20.   pinMode(PD1, OUTPUT);
  21.   pinMode(PD2, OUTPUT);
  22.   pinMode(PD3, OUTPUT);
  23.   pinMode(PD4, OUTPUT);
  24.   pinMode(PD5, OUTPUT);
  25.   pinMode(PD6, OUTPUT);
  26. }
  27. void blink(uint8_t pin, uint8_t n) {
  28.   for (uint8_t i = 0; i < n; i++) {
  29.     digitalToggle(pin);
  30.     delay(1);
  31.   }
  32. }
  33. // the loop function runs over and over again forever
  34. void loop() {
  35.   blink(PA1, 2);  //每个脚不同的翻转次数,可通过示波器检测判别
  36.   blink(PA2, 4);
  37.   blink(PA3, 6);
  38.   blink(PB4, 8);
  39.   blink(PB5, 10);
  40.   blink(PC3, 12);
  41.   blink(PC4, 14);
  42.   blink(PC5, 16);
  43.   blink(PC6, 18);
  44.   blink(PC7, 20);
  45.   blink(PD1, 22);
  46.   blink(PD2, 24);
  47.   blink(PD3, 26);
  48.   blink(PD4, 28);
  49.   blink(PD5, 30);
  50.   blink(PD6, 32);
  51. }

程序比较简单,line 11~26 对stm8s00f3p6 所以gpio 脚,均设置为输出;
line 38~53 每个循环中对每个脚的电平翻转不同的次数;
然后我们就可以通过示波器看三位数码管引脚上的波形,数一下翻转次数,对照line 38~53程序,我们就知道数码管和stm8是如何连接的了:

整理如下:
//3digits:

//A  PC4
//B  PB5
//C  PC7
//D  PD1
//E  PD3
//F  PC3
//G  PB4
//DP PD2
//D1 PC6
//D2 PC5
//D3 PA3
为了在3位七段数码管上显示数据,我还写了个七段数码管驱动库:(在 stm8\libraries\SevenSegment);
用这个库我们可以显示数据了:(示例stm8\libraries\SevenSegment\Example\seg7d_shownum)
  1. /*
  2.   SevenSegment show num demo by huaweiwx@sina.com 2018.3.8
  3. */
  4. //3digits:
  5. //A PC4
  6. //B PB5
  7. //C PC7
  8. //D PD1
  9. //E PD3
  10. //F PC3
  11. //G PB4
  12. //DP PD2
  13. //D1 PC6
  14. //D2 PC5
  15. //D3 PA3
  16. #include <SevenSegment.h>
  17. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,   D1,   D2,   D3,   D4 );//for 4 digits (max 4digts)
  18. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,   D1,   D2,   D3);       //for 3 digits
  19. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,   D1,   D2);             //for 2 digits
  20. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,   D1);                   //for 1 digits
  21. SevenSegment (seg7d3,    PC4,  PB5, PC7, PD1, PD3 , PC3, PB4, PD2,  PC6 , PC5,  PA3 );    /*use 3 digits*/
  22. void setup() {
  23.   seg7d3_begin(1); //0/1 共阳/阴7段数码管
  24. }
  25. void loop() {
  26.   for (uint8_t i3 = 0; i3 < 10; i3++) {
  27.     for (uint8_t i2 = 0; i2 < 10; i2++) {
  28.       for (uint8_t i1 = 0; i1 < 10; i1++) {
  29.         seg7d3_showDEC(i3 * 100 + i2 * 10 + i1);
  30.         for (uint8_t i = 0; i < 100; i++) seg7d3_display();
  31.       }
  32.     }
  33.   }
  34. }
简单介绍:
23 建立一个 SevenSegment的实例 seg7d3
26 seg7d3 初始化;
29~ 依次显示0~999

有了上述基础,我们就可以重写二线电压程序了:(stm8\libraries\SevenSegment\Example\seg7d_Vmeter
  1. /*
  2.   Vmeter.ino SevenSegment lib demo by huaweiwx@sina.com 2018.3.8
  3. */
  4. //3digits:
  5. //A  PC4
  6. //B  PB5
  7. //C  PC7
  8. //D  PD1
  9. //E  PD3
  10. //F  PC3
  11. //G  PB4
  12. //DP PD2
  13. //D1 PC6
  14. //D2 PC5
  15. //D3 PA3
  16. #include <SevenSegment.h>
  17. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,  D1,   D2,   D3,   D4 );//for 4 digits (max 4digts)
  18. //SevenSegment (instance,  A,   B,   C,   D,   E,   F,   G,   P,  D1,   D2,   D3);       //for 3 digits
  19. SevenSegment(seg7d3,   PC4, PB5, PC7, PD1, PD3, PC3, PB4, PD2, PC6 , PC5, PA3);    /*use 3 digits*/
  20. #define VPIN PD6  //电压检测输入脚 PD2/3/5/6 之一
  21. void setup() {
  22.   seg7d3_begin(1);  //0/1 共阳/阴7段数码管初始化
  23.   pinMode(VPIN, INPUT);
  24. }
  25. #define Vk (32*307) // 校准系数 32* 307/10v
  26. static uint32_t vin;
  27. void loop() {
  28.   vin = 0;
  29.   for (uint8_t i = 0; i < 32; i++) {
  30.     vin += analogRead(VPIN);
  31.     for (uint8_t j = 0; j < 5; j++) seg7d3_display(); //刷新 5 次
  32.   }
  33.   
  34. #if 0  // 显示 校准值1/ 电压0
  35.   seg7d3_showDEC(vin/32); //30V 5V 两点校准值V30K V05K显示
  36. #else  
  37.   vin *=100;
  38.   //可用seg7d3_showFloat 直接显示浮点数,但计算慢,占内存
  39.   //用整数显示,快速资源占用少
  40.   seg7d3_showDEC(vin / Vk); //显示整数,会清小数点显示,需重设
  41.   seg7d3_setpoint(1);          // 重设显示小数点
  42. #endif
  43. }
简单说明:
23 定义模拟输入脚,stm8 可能的输入脚是 PD2/3/5/6 PD2/3 已经用在驱动7段数码管了,只可能是PD5或 PD6,一试就知道是PD6
37~40 循环32次读取模拟输入值并累加,循环内还刷新数码管显示5次,这样数码管就不会闪烁了;
42~52 将模拟输入值转换为电压显示值并送入7段显示缓冲区中;
现在点取上传,这个两线电压表运行的已经是我们自己的程序了,如果修改成更为精确的多点校正程序,可以提高精度,如果引出PD5,我们还可以做成多路电压表,如果配合运放,则可以变成电流表了。
注:stm8 arduino的最新更新已在百度共享和github同步更新;

注意事项:!!重要!!
1  调试口引出的那个VCC,是和两线电压输入(红线)相通,不是mcu的vcc,因此不能用stlink的3.3v,而要接stlink的5v才能用来作电源输入;
2  当stlink的vcc(3.3或5v)  连接该板子时, 电源输入脚红线  !!绝对不能同时接电!!

两个(电压不同)电源并联后果十分严重!!!
两个(电压不同)电源并联后果十分严重!!!
两个(电压不同)电源并联后果十分严重!!!
(重要事情说三遍)



[ 此帖被huaweiwx在2018-04-15 00:42重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共3条打赏 ,M币+30
weizaisifang M币 +13 謝謝分享 2018-04-18
温力口 M币 +9 谢谢分享,认真发贴。 2018-04-15
cao57508 M币 +8 这个表好像我也有,这个实验可以做一下 2018-04-14
离线cao57508

发帖
2265
M币
3657
专家
9
粉丝
85
只看该作者 1楼 发表于: 2018-04-14
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+20
huaweiwx M币 +20 我还有一个stm8的电压电流表VC288,也可以按上述方法玩; 2018-04-15
离线huaweiwx

发帖
1372
M币
2167
专家
65
粉丝
297
只看该作者 2楼 发表于: 2018-04-15
回 cao57508 的帖子
请登录后查看
[ 此帖被huaweiwx在2018-04-15 00:28重新编辑 ]
离线dujq

发帖
427
M币
481
专家
4
粉丝
51
只看该作者 3楼 发表于: 2018-04-15
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+9
huaweiwx M币 +9 - 2018-04-15
离线ynymwtb

发帖
685
M币
3919
专家
10
粉丝
34
只看该作者 4楼 发表于: 2018-04-15
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+9
huaweiwx M币 +9 - 2018-04-15
离线温力口

发帖
60313
M币
51283
专家
569
粉丝
909
只看该作者 5楼 发表于: 2018-04-15
请登录后查看
本帖最近打赏记录:共1条打赏 ,M币+9
huaweiwx M币 +9 - 2018-04-15
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个