日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/8 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 efm32芯片电压_谁说壁虎没用?用efm32做个USB电压电流表(可诱导QC2.0) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在瘋狂的擼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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。