
-
UID:1023450
-
- 注册时间2011-12-16
- 最后登录2022-04-17
- 在线时间2350小时
-
-
访问TA的空间加好友用道具
|
新年大礼包: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) - /*
- testPin.ino 对每个脚翻转电平,通过示波器检测波形,探测引脚
- for stm8s003f/103f 示例针对 stm8s003f/103f
-
- by huaweiwx@sina.com 2018.4.2
- */
- // the setup function runs once when you press reset or power the board
- void setup() {
- // initialize digital pin LED_BUILTIN as an output.
- pinMode(PA1, OUTPUT); //set all pins as OUTPUT 将所有脚设定为输出
- pinMode(PA2, OUTPUT);
- pinMode(PA3, OUTPUT);
- pinMode(PB4, OUTPUT);
- pinMode(PB5, OUTPUT);
- pinMode(PC3, OUTPUT);
- pinMode(PC4, OUTPUT);
- pinMode(PC5, OUTPUT);
- pinMode(PC6, OUTPUT);
- pinMode(PC7, OUTPUT);
- pinMode(PD1, OUTPUT);
- pinMode(PD2, OUTPUT);
- pinMode(PD3, OUTPUT);
- pinMode(PD4, OUTPUT);
- pinMode(PD5, OUTPUT);
- pinMode(PD6, OUTPUT);
- }
- void blink(uint8_t pin, uint8_t n) {
- for (uint8_t i = 0; i < n; i++) {
- digitalToggle(pin);
- delay(1);
- }
- }
- // the loop function runs over and over again forever
- void loop() {
- blink(PA1, 2); //每个脚不同的翻转次数,可通过示波器检测判别
- blink(PA2, 4);
- blink(PA3, 6);
- blink(PB4, 8);
- blink(PB5, 10);
- blink(PC3, 12);
- blink(PC4, 14);
- blink(PC5, 16);
- blink(PC6, 18);
- blink(PC7, 20);
- blink(PD1, 22);
- blink(PD2, 24);
- blink(PD3, 26);
- blink(PD4, 28);
- blink(PD5, 30);
- blink(PD6, 32);
- }
程序比较简单,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) - /*
- SevenSegment show num demo by huaweiwx@sina.com 2018.3.8
- */
- //3digits:
- //A PC4
- //B PB5
- //C PC7
- //D PD1
- //E PD3
- //F PC3
- //G PB4
- //DP PD2
- //D1 PC6
- //D2 PC5
- //D3 PA3
- #include <SevenSegment.h>
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1, D2, D3, D4 );//for 4 digits (max 4digts)
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1, D2, D3); //for 3 digits
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1, D2); //for 2 digits
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1); //for 1 digits
- SevenSegment (seg7d3, PC4, PB5, PC7, PD1, PD3 , PC3, PB4, PD2, PC6 , PC5, PA3 ); /*use 3 digits*/
- void setup() {
- seg7d3_begin(1); //0/1 共阳/阴7段数码管
- }
- void loop() {
- for (uint8_t i3 = 0; i3 < 10; i3++) {
- for (uint8_t i2 = 0; i2 < 10; i2++) {
- for (uint8_t i1 = 0; i1 < 10; i1++) {
- seg7d3_showDEC(i3 * 100 + i2 * 10 + i1);
- for (uint8_t i = 0; i < 100; i++) seg7d3_display();
- }
- }
- }
- }
简单介绍: 23 建立一个 SevenSegment的实例 seg7d326 seg7d3 初始化;29~ 依次显示0~999
有了上述基础,我们就可以重写二线电压程序了:(stm8\libraries\SevenSegment\Example\seg7d_Vmeter - /*
- Vmeter.ino SevenSegment lib demo by huaweiwx@sina.com 2018.3.8
- */
- //3digits:
- //A PC4
- //B PB5
- //C PC7
- //D PD1
- //E PD3
- //F PC3
- //G PB4
- //DP PD2
- //D1 PC6
- //D2 PC5
- //D3 PA3
- #include <SevenSegment.h>
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1, D2, D3, D4 );//for 4 digits (max 4digts)
- //SevenSegment (instance, A, B, C, D, E, F, G, P, D1, D2, D3); //for 3 digits
- SevenSegment(seg7d3, PC4, PB5, PC7, PD1, PD3, PC3, PB4, PD2, PC6 , PC5, PA3); /*use 3 digits*/
- #define VPIN PD6 //电压检测输入脚 PD2/3/5/6 之一
- void setup() {
- seg7d3_begin(1); //0/1 共阳/阴7段数码管初始化
- pinMode(VPIN, INPUT);
- }
- #define Vk (32*307) // 校准系数 32* 307/10v
- static uint32_t vin;
- void loop() {
- vin = 0;
- for (uint8_t i = 0; i < 32; i++) {
- vin += analogRead(VPIN);
- for (uint8_t j = 0; j < 5; j++) seg7d3_display(); //刷新 5 次
- }
-
- #if 0 // 显示 校准值1/ 电压0
- seg7d3_showDEC(vin/32); //30V 5V 两点校准值V30K V05K显示
- #else
- vin *=100;
- //可用seg7d3_showFloat 直接显示浮点数,但计算慢,占内存
- //用整数显示,快速资源占用少
- seg7d3_showDEC(vin / Vk); //显示整数,会清小数点显示,需重设
-
- seg7d3_setpoint(1); // 重设显示小数点
- #endif
- }
简单说明: 23 定义模拟输入脚,stm8 可能的输入脚是 PD2/3/5/6 PD2/3 已经用在驱动7段数码管了,只可能是PD5或 PD6,一试就知道是PD637~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重新编辑 ]
|