efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)
在瘋狂的擼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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三极管参数
- 下一篇: win10无线投屏_手机投屏到电脑竟如此