在疯狂的撸pos的过程中,坛友看重的最多是电池,紧接着就是stm32/gd32单片机,而核心为efm32一派的pos机,因为资料少,没调试工具,就被打上了:没卵用,垃圾,便宜货等等的名号,被大家仍在墙角堆灰。为了利用上这只小壁虎,于是乎为决定研究研究。

开始入门是照着@kanamu 大神的帖子来的,玩了几天,觉得壁虎的adc性能不错(1msps,12bit,4ch,内部1.25/2.5v的bandgap基准,输入阻抗高,可以差分输入),于是就有了这个usb小表的小项目。

然后从学习点亮第一个LED灯到现在,掐指一算,应该就两个星期的零碎时间搞起来了。

好的,不啰嗦了,开始

如果想要学习的话,两个东西必备,首先要一个jlink。怎么?没有jlink?用pos机做一个呗,只要一块钱

【教程】用gd32做一个jlink-ob调试器,并吊打壁虎(efm32)|http://bbs.mydigit.cn/read.php?tid=1692562

然后开发环境,我选择的是官方提供的simplicity-studio,图形化的开发环境,很简单的说,点几下,选一下就可以玩了,不过有些坛友说太大难下载,这个嘛,我也帮不了你了,我这里下载能到100兆帕的样子(偷笑)

下载地址:http://cn.silabs.com/products/mcu/Pages/simplicity-studio.aspx

网速快的可以先现在在线端,然后补充对应型号的库就好了,这样省空间点

当然我这个小表现在的状态还是原型样机,验证阶段。没有任何显示装置,电压电流靠串口回传的,本来搞好了数码管,但懒得飞线焊上,那就将就下了,自用无所谓了

图片:21.JPG

小表和jlink的整套合影,简单粗糙啊真是

图片:整套设备.JPG

中间飞了一堆线

图片:24.JPG

壁虎efm32单片机特写

图片:捕获.JPG

这个是usb部分焊好的电路,双面洞洞板真是个折磨人的小妖精啊

图片:23.JPG

图片:22.JPG

qc2.0诱导试验

诱导开始前,电压5v,红灯亮

图片:诱导1.JPG

诱导成功,输出9v,因为我这个充电头没有12v档,就没测了

图片:诱导2.JPG

简单说一下qc2.0的协议,手机在d+上加0.6v电压,这时充电器内部d+和d-是联通的,d-也是0.6v,在1.35秒后,充电器断开d+和d-的联通,d-电压降到0,这时表示充电器支持协议,接下来就是手机请求电压,在d+加3.3v,d-加0.6v时,输出9v,在d+加0.6v,d-加0.6v时,输出12v,在d+加3.3v,d-加3.3v时,输出20v,在d+加0.6v,d-加0v时,输出5v,然后就可以靠这协议来骗一把充电器了。在d+上我用dac直接实现,这很方便,d-上接adc,同时有一个引脚推挽输出高,10k和2.2k分压为0.6v,这样就可以让充电器输出9v了,18w功率可是爽歪歪啊。

电压电流测试

电流取样电阻因为手头只有100毫欧的,只能硬头皮上了,虽然好像真的有点大了。

目前串口值是原始数据,不过波动不算太大

5v时给手机充电,电压0x640左右,换算为5.08v

电流为0xae左右,500ma左右

图片:手机充电.JPG

诱导为9v时,因为我没有合适负载,所以电流数据是0了,就测了下电压0xB2f左右,9.08v的样子

图片:9v.JPG

这个值有点偏低的问题,是adc有点偏低,之前测试了整个量程,大概偏了一个f的样子,具体原因不是很清楚,可能也和电路有关,不过偏的比较线性,后面可以校准,输出值波动不大,这倒是个好事。

最后上电路图,简易的

图片:电路图.JPG

当然以上要保证最小系统正常,因为实验阶段是在pos板子上改的,就没必要理,不过还是贴张最小系统的图

图片:最小系统.JPG

仿制难度应该不大,就是太简单太low了,不过想玩qc2.0的可以试试

我贴下源代码,真的不长,不过没注释,我太懒了

其实,真心,这货的现在的难度,就是点几下鼠标,然后后面的操作就很简单了,已经有点类似arduino的感觉了

复制代码

#include

#include

#include "em_usart.h"

#include "em_device.h"

#include "em_chip.h"

#include "InitDevice.h"

#include "em_cmu.h"

#include "em_gpio.h"

#include "stdio.h"

#include "em_emu.h"

#include "em_adc.h"

#include "em_dac.h"

void sys_int(void)

{

CHIP_Init();

/* Infinite loop */

enter_DefaultMode_from_RESET();

//GPIO_PinOutClear(gpioPortA, 8);

/*串口进中断*/

USART0->IFC = _USART_IFC_MASK;

NVIC_ClearPendingIRQ(USART0_RX_IRQn);

NVIC_EnableIRQ(USART0_RX_IRQn);

USART0->IEN = USART_IEN_RXDATAV;

USART0->ROUTE |=  USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_LOCATION_LOC0;

/*串口进中断结束*/

/* Enable DAC channel 0, located on pin PB11 */

DAC_Enable(DAC0, 0, true);

}

/**************************************************************************//**

* [url=u.php?uid=650075]@brief[/url]    Write DAC conversion value

*****************************************************************************/

void DAC_WriteData(DAC_TypeDef *dac, unsigned int value, unsigned int ch)

{

/* Write data output value to the correct register. */

if (!ch)

{

dac->CH0DATA = value;

}

else

{

dac->CH1DATA = value;

}

}

uint32_t ADC0_get_result()

{

uint32_t samp;

ADC_Start(ADC0, adcStartSingle);

/* Wait while conversion is active */

while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;

/* Get ADC result */

samp = ADC_DataSingleGet(ADC0);

return samp;

}

uint32_t ADC0_get_send_result()

{

uint32_t samp;

uint8_t cache1 = 0;

uint8_t cache = 0;

uint32_t cache2 = 0;

samp = ADC0_get_result();

cache2 = samp;

cache1 = samp;

samp >>= 8;

cache = samp;

USART_Tx(USART0, cache);

USART_Tx(USART0, cache1);

return cache2;

}

void adc_change_input_ch(uint8_t ch)

{

ADC_InitSingle_TypeDef initsingle = ADC_INITSINGLE_DEFAULT;

switch(ch)

{

case 4:

initsingle.prsSel = adcPRSSELCh0;

initsingle.acqTime = adcAcqTime64;

initsingle.reference = adcRef1V25;

initsingle.resolution = adcRes12Bit;

initsingle.input = adcSingleInpCh4;

initsingle.diff = 0;

initsingle.prsEnable = 0;

initsingle.leftAdjust = 0;

initsingle.rep = 0;

ADC_InitSingle(ADC0, &initsingle);

break;

case 5:

initsingle.prsSel = adcPRSSELCh0;

initsingle.acqTime = adcAcqTime64;

initsingle.reference = adcRef1V25;

initsingle.resolution = adcRes12Bit;

initsingle.input = adcSingleInpCh5;

initsingle.diff = 0;

initsingle.prsEnable = 0;

initsingle.leftAdjust = 0;

initsingle.rep = 0;

ADC_InitSingle(ADC0, &initsingle);

break;

case 6:

initsingle.prsSel = adcPRSSELCh0;

initsingle.acqTime = adcAcqTime64;

initsingle.reference = adcRef1V25;

initsingle.resolution = adcRes12Bit;

initsingle.input = adcSingleInpCh6;

initsingle.diff = 0;

initsingle.prsEnable = 0;

initsingle.leftAdjust = 0;

initsingle.rep = 0;

ADC_InitSingle(ADC0, &initsingle);

break;

}

}

/**************************************************************************//**

* [url=u.php?uid=650075]@brief[/url]    Main function

*****************************************************************************/

int main(void)

{

int i;

uint32_t sample;

uint8_t working_satae = 1;//0-普通5v  //1-qc2.0插入前  //2-qc2.0前奏   //3-qc2.0-9v

uint32_t DAC_Value;

sys_int();

while (1)

{

switch(working_satae)

{

case 0:

{

for(i = 0; i < 20000; i++);

DAC_Enable(DAC0, 0, 0);

adc_change_input_ch(4);

ADC0_get_send_result();

adc_change_input_ch(6);

ADC0_get_send_result();

break;

}//case 0 (责任编辑:admin)

efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)相关推荐

  1. efm32芯片电压_小壁虎PK小蝴蝶(EFM32 vs STM32L)

    近日因要使用低功耗MCU,故花了点时间来研究ARM cortex M系列的低功耗MCU,今天的主角,相信熟悉 ARM Cortex 单片机的大神们,一听这名字,就知道是谁了. -EnergyMicro ...

  2. efm32芯片电压_解读GP21+EFM32低功耗热量表电路

    基于Energymicro公司的32位Cortex-M3内核的超低功耗微控制器EFM32与ACAM公司的高集成度TDC-GP21芯片推出的超声波热量表方案,能够充分发挥EFM32的超低功耗与高运算能力 ...

  3. efm32芯片电压_【经验】基于EFM32G232芯片 ADC采样毛刺问题分析以及解决方案

    在JYL-60架空暂态录波型远传故障指示器项目开发过程中,Silicon Labs的EFM32G232 32位MCU作为暂态录波型故障指示器的CPU,发现ADC采样电流或电压数据出现毛刺的情况.下图1 ...

  4. EFM32芯片被锁解决方法

    调试EFM32程序的时候,刚突然出现调试软件(JLINK或者energy AwareCommander)无法识别芯片有如下显示: 那么出现这种情况你如果排除掉硬件连接上没有问题的话,就应该考虑是不是芯 ...

  5. arduino 读取模拟电压_基础部分-读取模拟电压

    这个示例展示了如何用模拟引脚0来读取模拟输入,用analogRead()来转换电压数值,之后把这个值输出在编译器的串口监视器上. 硬件需求 -Arduino控制板 -10K电位器 电路 上面的接线图是 ...

  6. 手机常用的快充QC2.0/3.0协议,你都了解吗?设备(比如支持快充的手机)通过USB数据通讯口D+/D-输出电压信号给充电器,充电器内置USB输入解码芯片,然后充电器会输出目标电压。

    手机常用的快充QC2.0/3.0协议,你都了解吗? 零是起源 资料共享- 公众号:零是起源 15 人赞同了该文章 何谓快充QC2.0/3.0协议? 1.QC2.0协议 QC2.0就是Quick Cha ...

  7. HTML5期末大作业:婚庆网站设计——红色的婚庆(18页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:婚庆网站设计--红色的婚庆(18页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电 ...

  8. div+css静态网页设计——迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作

    HTML5期末大作业:电影网站设计--迪斯尼公主滚动特效(7页) HTML5网页设计成品_学生DW静态网页设计代做_web课程设计网页制作 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游 ...

  9. 电压比较器电路,当两个输入端全是相同电平时,输出什么电平?则相当于差模输入电压为零,不考虑失调或共模输出就应该输出为0

    运放开环使用是电压比较器,不是电平比较器.高电平的电压范围很宽,TTL电路中1.4+到5V全是高电平,1.4-到0V全是低电平,所以两个输入端全是高电平或全是低电平还要看电压谁高谁低.如果是两个输入端 ...

最新文章

  1. 2003 resource kit之Robocopy 高效文件复制工具
  2. Solr4.7新建core
  3. Gearman 异步处理委派任务
  4. Java注解的基本概念和原理及其简单实用
  5. asp.net matlab,ASP.NET与MATLAB混合编译以及数据传递【更新中】
  6. apache启动错误 AH00072: make_sock: could not bind to address [::]:443
  7. 具有亲和力的文字隐藏方法
  8. matlab编写全置信度函数,Matlab_curve_fitting_tool的用法图文结合
  9. 【深度优先搜索】计蒜客:方程的解数
  10. NumPy库---文件操作
  11. navicat12.0.26 激活
  12. jieba库词频统计_jieba库的使用与词频统计
  13. rar、zip优缺点
  14. 方维分享增加列表页图片alt title属性,提高转化率
  15. 用Egret制作功能简单的打地鼠类游戏《冰桶挑战》
  16. MySQL_Windows 下重启MySQL服务
  17. 记录本地 Docker 新建镜像,推送到Daocloud
  18. nRF51822蓝牙开发
  19. ElasticSearch六:搜索模板与suggest search(自动补全)、地图位置检索功能实现、FileBeat与LogSteash使用
  20. PROFINET转Modbus连接西门子PLC与汇川变频器

热门文章

  1. 7、ARM嵌入式系统:LCD/数码管/OLED初始化
  2. 使用UE4的nDisplay渲染到多个显示器
  3. 华为手机设置微信气泡
  4. [转载]从WiMAX看自主创新
  5. java改变背景图片大小,设置背景图片大小相同的的Java应用程序窗口/屏幕
  6. 如何看电脑内存型号?
  7. 关于图片裁剪怎么弄,这里分享几款软件
  8. 史上最全3DMAX入门教程来啦,小白赶紧收藏!
  9. Azure DevOps —— Azure Board 之 长篇故事、特性、用户情景(故事)的用法
  10. echarts - 折线图 - 每分钟刷新数据并显示