最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

当前位置: 主页 > 电子DIY > 工具仪表 > 仪器仪表 >

谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

时间:2017-05-18 17:08来源:数码之家 作者:2545889167 点击:
在疯狂的撸pos的过程中,坛友看重的最多是电池,紧接着就是stm32/gd32单片机,而核心为efm32一派的pos机,因为资料少,没调试工具,就被打上了:没卵用,垃圾,便宜货等等的名号,被大家仍在墙角堆灰。为了利用上这只小壁虎,于是乎为决定研究研究。开始入门
在疯狂的撸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
网速快的可以先现在在线端,然后补充对应型号的库就好了,这样省空间点

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


小表和jlink的整套合影,简单粗糙啊真是
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

中间飞了一堆线
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

壁虎efm32单片机特写
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

这个是usb部分焊好的电路,双面洞洞板真是个折磨人的小妖精啊
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

qc2.0诱导试验
诱导开始前,电压5v,红灯亮
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

诱导成功,输出9v,因为我这个充电头没有12v档,就没测了
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)


简单说一下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左右
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

诱导为9v时,因为我没有合适负载,所以电流数据是0了,就测了下电压0xB2f左右,9.08v的样子
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

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

最后上电路图,简易的
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

当然以上要保证最小系统正常,因为实验阶段是在pos板子上改的,就没必要理,不过还是贴张最小系统的图
谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)

仿制难度应该不大,就是太简单太low了,不过想玩qc2.0的可以试试
我贴下源代码,真的不长,不过没注释,我太懒了
其实,真心,这货的现在的难度,就是点几下鼠标,然后后面的操作就很简单了,已经有点类似arduino的感觉了

复制代码
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include "em_usart.h"
  4. #include "em_device.h"
  5. #include "em_chip.h"
  6. #include "InitDevice.h"
  7. #include "em_cmu.h"
  8. #include "em_gpio.h"
  9. #include "stdio.h"
  10. #include "em_emu.h"
  11. #include "em_adc.h"
  12. #include "em_dac.h"
  13.  
  14.  
  15. void sys_int(void)
  16. {
  17.     CHIP_Init();
  18.  
  19.     /* Infinite loop */
  20.     enter_DefaultMode_from_RESET();
  21.  
  22.     //GPIO_PinOutClear(gpioPortA, 8);
  23.  
  24.     /*串口进中断*/
  25.     USART0->IFC = _USART_IFC_MASK;
  26.     NVIC_ClearPendingIRQ(USART0_RX_IRQn);
  27.     NVIC_EnableIRQ(USART0_RX_IRQn);
  28.     USART0->IEN = USART_IEN_RXDATAV;
  29.     USART0->ROUTE |=  USART_ROUTE_TXPEN | USART_ROUTE_RXPEN | USART_ROUTE_LOCATION_LOC0;
  30.     /*串口进中断结束*/
  31.     /* Enable DAC channel 0, located on pin PB11 */
  32.     DAC_Enable(DAC0, 0, true);
  33.  
  34. }
  35.  
  36.  
  37. /**************************************************************************//**
  38. * [url=u.php?uid=650075]@brief[/url]    Write DAC conversion value
  39. *****************************************************************************/
  40. void DAC_WriteData(DAC_TypeDef *dac, unsigned int value, unsigned int ch)
  41. {
  42.     /* Write data output value to the correct register. */
  43.     if (!ch)
  44.     {
  45.         dac->CH0DATA = value;
  46.     }
  47.     else
  48.     {
  49.         dac->CH1DATA = value;
  50.     }
  51. }
  52.  
  53. uint32_t ADC0_get_result()
  54. {
  55.     uint32_t samp;
  56.     ADC_Start(ADC0, adcStartSingle);
  57.     /* Wait while conversion is active */
  58.     while (ADC0->STATUS & ADC_STATUS_SINGLEACT) ;
  59.     /* Get ADC result */
  60.     samp = ADC_DataSingleGet(ADC0);
  61.     return samp;
  62. }
  63.  
  64. uint32_t ADC0_get_send_result()
  65. {
  66.     uint32_t samp;
  67.  
  68.     uint8_t cache1 = 0;
  69.     uint8_t cache = 0;
  70.     uint32_t cache2 = 0;
  71.     samp = ADC0_get_result();
  72.     cache2 = samp;
  73.     cache1 = samp;
  74.     samp >>= 8;
  75.     cache = samp;
  76.     USART_Tx(USART0, cache);
  77.     USART_Tx(USART0, cache1);
  78.     return cache2;
  79.  
  80. }
  81.  
  82. void adc_change_input_ch(uint8_t ch)
  83. {
  84.     ADC_InitSingle_TypeDef initsingle = ADC_INITSINGLE_DEFAULT;
  85.     switch(ch)
  86.     {
  87.     case 4:
  88.         initsingle.prsSel = adcPRSSELCh0;
  89.         initsingle.acqTime = adcAcqTime64;
  90.         initsingle.reference = adcRef1V25;
  91.         initsingle.resolution = adcRes12Bit;
  92.         initsingle.input = adcSingleInpCh4;
  93.         initsingle.diff = 0;
  94.         initsingle.prsEnable = 0;
  95.         initsingle.leftAdjust = 0;
  96.         initsingle.rep = 0;
  97.         ADC_InitSingle(ADC0, &initsingle);
  98.         break;
  99.     case 5:
  100.         initsingle.prsSel = adcPRSSELCh0;
  101.         initsingle.acqTime = adcAcqTime64;
  102.         initsingle.reference = adcRef1V25;
  103.         initsingle.resolution = adcRes12Bit;
  104.         initsingle.input = adcSingleInpCh5;
  105.         initsingle.diff = 0;
  106.         initsingle.prsEnable = 0;
  107.         initsingle.leftAdjust = 0;
  108.         initsingle.rep = 0;
  109.         ADC_InitSingle(ADC0, &initsingle);
  110.         break;
  111.  
  112.     case 6:
  113.         initsingle.prsSel = adcPRSSELCh0;
  114.         initsingle.acqTime = adcAcqTime64;
  115.         initsingle.reference = adcRef1V25;
  116.         initsingle.resolution = adcRes12Bit;
  117.         initsingle.input = adcSingleInpCh6;
  118.         initsingle.diff = 0;
  119.         initsingle.prsEnable = 0;
  120.         initsingle.leftAdjust = 0;
  121.         initsingle.rep = 0;
  122.         ADC_InitSingle(ADC0, &initsingle);
  123.         break;
  124.     }
  125. }
  126.  
  127. /**************************************************************************//**
  128. * [url=u.php?uid=650075]@brief[/url]    Main function
  129. *****************************************************************************/
  130. int main(void)
  131. {
  132.     int i;
  133.  
  134.     uint32_t sample;
  135.     uint8_t working_satae = 1;//0-普通5v  //1-qc2.0插入前  //2-qc2.0前奏   //3-qc2.0-9v
  136.     uint32_t DAC_Value;
  137.     sys_int();
  138.     while (1)
  139.     {
  140.         switch(working_satae)
  141.         {
  142.             case 0:
  143.             {
  144.                 for(i = 0; i < 20000; i++);
  145.                 DAC_Enable(DAC0, 0, 0);
  146.                 adc_change_input_ch(4);
  147.                 ADC0_get_send_result();
  148.                 adc_change_input_ch(6);
  149.                 ADC0_get_send_result();
  150.                 break;
  151.             }//case 0 (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容