efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)
在瘋狂的擼pos的過(guò)程中,壇友看重的最多是電池,緊接著就是stm32/gd32單片機(jī),而核心為efm32一派的pos機(jī),因?yàn)橘Y料少,沒(méi)調(diào)試工具,就被打上了:沒(méi)卵用,垃圾,便宜貨等等的名號(hào),被大家仍在墻角堆灰。為了利用上這只小壁虎,于是乎為決定研究研究。
開(kāi)始入門(mén)是照著@kanamu 大神的帖子來(lái)的,玩了幾天,覺(jué)得壁虎的adc性能不錯(cuò)(1msps,12bit,4ch,內(nèi)部1.25/2.5v的bandgap基準(zhǔn),輸入阻抗高,可以差分輸入),于是就有了這個(gè)usb小表的小項(xiàng)目。
然后從學(xué)習(xí)點(diǎn)亮第一個(gè)LED燈到現(xiàn)在,掐指一算,應(yīng)該就兩個(gè)星期的零碎時(shí)間搞起來(lái)了。
好的,不啰嗦了,開(kāi)始
如果想要學(xué)習(xí)的話,兩個(gè)東西必備,首先要一個(gè)jlink。怎么?沒(méi)有jlink?用pos機(jī)做一個(gè)唄,只要一塊錢(qián)
【教程】用gd32做一個(gè)jlink-ob調(diào)試器,并吊打壁虎(efm32)|http://bbs.mydigit.cn/read.php?tid=1692562
然后開(kāi)發(fā)環(huán)境,我選擇的是官方提供的simplicity-studio,圖形化的開(kāi)發(fā)環(huán)境,很簡(jiǎn)單的說(shuō),點(diǎn)幾下,選一下就可以玩了,不過(guò)有些壇友說(shuō)太大難下載,這個(gè)嘛,我也幫不了你了,我這里下載能到100兆帕的樣子(偷笑)
下載地址:http://cn.silabs.com/products/mcu/Pages/simplicity-studio.aspx
網(wǎng)速快的可以先現(xiàn)在在線端,然后補(bǔ)充對(duì)應(yīng)型號(hào)的庫(kù)就好了,這樣省空間點(diǎn)
當(dāng)然我這個(gè)小表現(xiàn)在的狀態(tài)還是原型樣機(jī),驗(yàn)證階段。沒(méi)有任何顯示裝置,電壓電流靠串口回傳的,本來(lái)搞好了數(shù)碼管,但懶得飛線焊上,那就將就下了,自用無(wú)所謂了
圖片:21.JPG
小表和jlink的整套合影,簡(jiǎn)單粗糙啊真是
圖片:整套設(shè)備.JPG
中間飛了一堆線
圖片:24.JPG
壁虎efm32單片機(jī)特寫(xiě)
圖片:捕獲.JPG
這個(gè)是usb部分焊好的電路,雙面洞洞板真是個(gè)折磨人的小妖精啊
圖片:23.JPG
圖片:22.JPG
qc2.0誘導(dǎo)試驗(yàn)
誘導(dǎo)開(kāi)始前,電壓5v,紅燈亮
圖片:誘導(dǎo)1.JPG
誘導(dǎo)成功,輸出9v,因?yàn)槲疫@個(gè)充電頭沒(méi)有12v檔,就沒(méi)測(cè)了
圖片:誘導(dǎo)2.JPG
簡(jiǎn)單說(shuō)一下qc2.0的協(xié)議,手機(jī)在d+上加0.6v電壓,這時(shí)充電器內(nèi)部d+和d-是聯(lián)通的,d-也是0.6v,在1.35秒后,充電器斷開(kāi)d+和d-的聯(lián)通,d-電壓降到0,這時(shí)表示充電器支持協(xié)議,接下來(lái)就是手機(jī)請(qǐng)求電壓,在d+加3.3v,d-加0.6v時(shí),輸出9v,在d+加0.6v,d-加0.6v時(shí),輸出12v,在d+加3.3v,d-加3.3v時(shí),輸出20v,在d+加0.6v,d-加0v時(shí),輸出5v,然后就可以靠這協(xié)議來(lái)騙一把充電器了。在d+上我用dac直接實(shí)現(xiàn),這很方便,d-上接adc,同時(shí)有一個(gè)引腳推挽輸出高,10k和2.2k分壓為0.6v,這樣就可以讓充電器輸出9v了,18w功率可是爽歪歪啊。
電壓電流測(cè)試
電流取樣電阻因?yàn)槭诸^只有100毫歐的,只能硬頭皮上了,雖然好像真的有點(diǎn)大了。
目前串口值是原始數(shù)據(jù),不過(guò)波動(dòng)不算太大
5v時(shí)給手機(jī)充電,電壓0x640左右,換算為5.08v
電流為0xae左右,500ma左右
圖片:手機(jī)充電.JPG
誘導(dǎo)為9v時(shí),因?yàn)槲覜](méi)有合適負(fù)載,所以電流數(shù)據(jù)是0了,就測(cè)了下電壓0xB2f左右,9.08v的樣子
圖片:9v.JPG
這個(gè)值有點(diǎn)偏低的問(wèn)題,是adc有點(diǎn)偏低,之前測(cè)試了整個(gè)量程,大概偏了一個(gè)f的樣子,具體原因不是很清楚,可能也和電路有關(guān),不過(guò)偏的比較線性,后面可以校準(zhǔn),輸出值波動(dòng)不大,這倒是個(gè)好事。
最后上電路圖,簡(jiǎn)易的
圖片:電路圖.JPG
當(dāng)然以上要保證最小系統(tǒng)正常,因?yàn)閷?shí)驗(yàn)階段是在pos板子上改的,就沒(méi)必要理,不過(guò)還是貼張最小系統(tǒng)的圖
圖片:最小系統(tǒng).JPG
仿制難度應(yīng)該不大,就是太簡(jiǎn)單太low了,不過(guò)想玩qc2.0的可以試試
我貼下源代碼,真的不長(zhǎng),不過(guò)沒(méi)注釋,我太懶了
其實(shí),真心,這貨的現(xiàn)在的難度,就是點(diǎn)幾下鼠標(biāo),然后后面的操作就很簡(jiǎn)單了,已經(jīng)有點(diǎn)類(lèi)似arduino的感覺(jué)了
復(fù)制代碼
#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);
/*串口進(jìn)中斷*/
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;
/*串口進(jìn)中斷結(jié)束*/
/* 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 (責(zé)任編輯:admin)
總結(jié)
以上是生活随笔為你收集整理的efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三极管参数
- 下一篇: win10无线投屏_手机投屏到电脑竟如此