一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3063|回复: 5
收起左侧

[STM8/STM32] [开源项目] OpenDSP(2) 改进dps5005程控电源 - WIFI/串口通信

[复制链接]
发表于 2017-3-8 11:11 | 显示全部楼层 |阅读模式
本帖最后由 winterpigz 于 2017-3-9 11:04 编辑

这是关于改进DPS5005的第二部分。  第一部分是关于进行DPS5005的逆向工程,第三部分介绍如何将DPS5005的出厂固件升级到OpenDPS。

OpenDPS的设计目标是开发一个同DPS5005(及类似设备)出厂固件具有相同的功能,具有简洁用户界面,并可以通过wifi或串行端口远程控制的三方固件。在前/后台功能分配上,按键/UART/ADC将使用中断处理,以便快速响应。 用户反馈和TFT显示将由应用前台控制。


出厂界面

    9116CA5E-EDF9-47DC-8366-E855737BEE98-14237-00000D6EA451827E_tmp.png
改进界面
948DA82D-4237-4A8E-B60F-115D0478ACDF-14237-00000D6FA45CB332_tmp.png
  
系统概况 OpenDPS中使用以下模块:
  • event - 使用环形缓冲区来存储来自中断上下文的事件,以便在应用程序上下文中处理。 事件是按钮按压,UART上的接收字节和过流保护触发
  • hw - 硬件抽象(ADC,GPIO,...)
  • ili9631c -  TFT驱动器
  • opendps - 主应用程序
  • past- 用于在闪存中存储持久参数
  • protocol - 用于串行协议来测试OpenDPS设备的帮助器
  • pwrctl - 功率控制,DAC和计算将ADC读数转换为例如。 电流消耗
  • ringbuf - 一个ringbuffer实现
  • spi_driver - 只是这样
  • tft -  TFT实用函数
  • tick分钟处理程序
  • uframe - 串口协议的成帧
  • ui - 处理用户界面
控制流 opendps.c中的前台程序是一个忙循环,等待事件到达循环缓冲区。 按键/串行输入/过流保护事件被放置在此缓冲区中。 应用程序调用UI模块,每250ms更新一次UI。 用户输入也在UI模块中处理。 事件是编码事件类型和可选事件数据的16位整数。 对于UART RX事件,数据显然是接收到的字节。 对于按按压,事件还包括是否为长按的信息。

ADC和DAC管理 由于我手头没有原理图,不得不逆向计算基于ADC读数的电压/电流。 我做了一些测量,并绘制在Google文档电子表格中找出
  • V_in(ADC1_IN8) - 对于给定通道8上的读数,输入电压是多少?
  • V_out(ADC1_IN9) - 对于给定通道9上的读数,输出电压是多少?
  • V_out(DAC) - 对于给定DAC设置,输出电压是多少?
  • I_out(ADC1_IN7) - 对于给定通道7上的读数,电流是多少?
https://johan.kanflo.com/wp-content/uploads/2017/03/Graph-I_out-vs-ADC-300x186.png
I_out(ADC)  
https://johan.kanflo.com/wp-content/uploads/2017/03/Graph-DAC-vs.-V_out-300x186.png
DAC(V_out)  
https://johan.kanflo.com/wp-content/uploads/2017/03/Graph-ADC-vs-V_in-300x186.pngADC
ADC(V_in)
为了降低ADC IRQ处理模块的复杂性,我预先计算了设置电流上限到ADC的值,从而快速确定是否发生流。 在这里,我遇到了一些问题,我手边的两个'5005'有不同的电流的ADC读数。其中一个返回了错误的电流,最后发现是由于当没有电流被输出时被ADC有不同的读值。 补救措施是在系统启动时获取前1000个样本,以计算0.00mA电流消耗和补偿的ADC值(请参阅adc_i_offset和hw.c中的朋友)。此外,我目前还在触发OCP之前采集了更多“过电流样本”。 这个方案需要进一步测试。


保存设置
用户的设置需要保存到非易失内存,这由past(参数存储)模块负责。 该模块使用两个块来存储数据。 一个是“当前块”:当它被占满时,将数据被复制到另一个块然后执行垃圾收集。 我利用计数器告诉哪个块是当前块。 理论上,掉电不应导致数据损坏丢失。


图形 用户界面使用了Ubuntu Condensed平滑字体用于渲染UI的两种不同大小字体。 该字体的两个文件可以在gfx / fonts中找到。 字形本身(例如ubuntu_condensed_48.png)和一个描述每个字符宽度的图像(例如ubuntu_condensed_48_width.png)。

https://johan.kanflo.com/wp-content/uploads/2017/03/ubuntu_condensed_48.png
Ubuntu Condensed,48
  宽度由第一行中的白色像素指示:

执行“make fonts”将调用font-convert.py进行转换 。字形PNG被转换为BGR565(由TFT使用)并且被写入font-X。[h | c]。 每个字形转换为单独的单元以加速了到TFT的显示拼接,具体可以参阅tft_putch(...)在tft.c中的用法。 阻塞DMA用于传输字形数据。 图标显示也是用类似的方法处理(参见wifi.h ),执行“make graphic”进行转换。 你应该能够以很少的困难,在理论上改变字体


远程控制 使用简单的串行协议(参见protocol.huframe.h ),计算机可以通过UART端口控制OpenDPS设备,UART端口FTDI串口或ESP8266。当然,ESP8266更是意思一些。

这里提供一个Python脚本与OpenDPS设备交互, dpsctl.py
                                                        
% dpsctl.py -h

usage: dpsctl.py [-h] [-d DEVICE] [-s] [-u VOLTAGE] [-i CURRENT] [-p POWER]
[-P] [-L] [-l] [-S] [-j] [-v]

Instrument an OpenDPS device

optional arguments:
-h, --help show this help message and exit
-d DEVICE, --device DEVICE
OpenDPS device to connect to. Can be a /dev/tty device
or an IP number. If omitted, dpsctl.py will try the
environment variable DPSIF
-s, --scan Scan for OpenDPS wifi devices
-u VOLTAGE, --voltage VOLTAGE
Set voltage (millivolt)
-i CURRENT, --current CURRENT
Set maximum current (milliampere)
-p POWER, --power POWER
Power 'on' or 'off'
-P, --ping Ping device
-L, --lock Lock device keys
-l, --unlock Unlock device keys
-S, --status Read voltage/current settings and measurements
-j, --json Output status as JSON
-v, --verbose Verbose communications

                        
               

该实用程序支持不同OpenDPS连接方式,包括IP地址和TTY设备。 对于WiFi连接的DPS:es,您可以使用选项 -scan 扫描网络上的所有OpenDPS设备。
任何带UART的ESP8266都可以工作。 连接上GND,RX和TX,然后编译和下载esp8266-proxy(不要忘记设置您的WiFi密码)就行了。
                                                                
                                                git clone https://github.com/kanflo/esp-open-rtos.gitcd esp-open-rtosgit submodule initgit submodule updategit checkout -b netif remotes/origin/sdk_system_get_netifexport EOR_ROOT=`pwd`echo '#define WIFI_SSID "my ssid"' > include/private_ssid_config.hecho '#define WIFI_PASS "my secret password"' >> include/private_ssid_config.hcd /path/to/esp8266-proxymake && make flash
                                                        
git clone https://github.com/kanflo/esp-open-rtos.git
cd esp-open-rtos
git submodule init
git submodule update
git checkout -b netif remotes/origin/sdk_system_get_netif
export EOR_ROOT=`pwd`
echo '#define WIFI_SSID "my ssid"' > include/private_ssid_config.h
echo '#define WIFI_PASS "my secret password"' >> include/private_ssid_config.h
cd /path/to/esp8266-proxy
make && make flash

                        
               

请注意,目前请不要用ESP Open RTOS源代码版本库上的master分支,因为我的个人分支上多播所需的功能尚未合并进来。
esp8266-proxy的设计是相当简单的。 它在端口5005上接收UDP数据包,然后转发到串行端口,并将响应返回到源地址和端口。
当OpenDPS启动时,WiFi图标将以1Hz闪烁。WiFi图标说明你的ESP8266已经连接到的WiFi,并告诉OpenDPS它是连接。



使用-scan选项可以扫描网络:
                                                        
% dpsctl.py --scan

172.16.3.203
1 OpenDPS device found

                        
               

接下来尝试ping:
                                                        
% dpsctl.py -d 172.16.3.203 --ping

                        
               

TFT应闪烁一次作为可视提示。 如果您收到“错误:超时与设备172.16.3.203交谈”,请检查RX和TX是否连接正确。 您也可以在ESP8266和OpenDPS的RX引脚上连接FTDI串口来调试通信。


第二部分结束,请参阅第三部分,了解如何将DPS5005升级到OpenDPS 5005。


------------------注释: 目前的固件不支持恒流模式




发表于 2017-3-8 11:47 | 显示全部楼层
本帖最后由 921665973 于 2017-3-8 11:55 编辑

 楼主| 发表于 2017-3-8 12:03 | 显示全部楼层
发表于 2017-3-8 13:11 | 显示全部楼层
多谢分享
发表于 2017-3-9 11:08 | 显示全部楼层
等你们玩成熟了,我再升级我的。呵呵!
发表于 2017-3-9 23:06 | 显示全部楼层
等有了原版固件我再刷。。。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-19 07:33 , Processed in 0.073567 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表