在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手工打造能分析CMOS和TTL電路的分析儀

數(shù)據(jù)分析與開(kāi)發(fā) ? 來(lái)源:電子森林 ? 作者: John Bradnam ? 2021-08-17 17:00 ? 次閱讀

這是發(fā)布在Hackster.io上的一個(gè)項(xiàng)目,作者為John Bradnam,一個(gè)很小的分析儀能分析CMOS和TTL電路,能夠測(cè)量5種狀態(tài),檢測(cè)脈沖并針對(duì)不同的狀態(tài)播放不同的聲音。

國(guó)外的玩家沒(méi)有我們方便,做個(gè)PCB是件很折騰的事情,因此簡(jiǎn)單的電路都要想辦法手工打造。

下面就是這個(gè)項(xiàng)目的簡(jiǎn)單介紹:

在此之前,作者嘗試做過(guò)多種不同的邏輯分析探針,看下圖是作者多年來(lái)設(shè)計(jì)的一些作品:

eee3f4ac-ff30-11eb-9bcf-12bb97331649.png

作者認(rèn)為應(yīng)該設(shè)計(jì)一款終極的邏輯探針,具有如下的一些特點(diǎn):

它必須足夠小以方便拿在手中

能夠顯示低、高和不關(guān)心的狀態(tài)

一個(gè)顯示系統(tǒng),在使用時(shí)易于閱讀

對(duì)“低”和“高”狀態(tài)有聲音反饋

處理不同邏輯系列的器件,例如:TTL 和 CMOS

能夠檢測(cè)探頭是否正在測(cè)量快速變化的信號(hào)

具有針對(duì)意外過(guò)電壓的輸入保護(hù)

硬件的設(shè)計(jì)

采用了ATtiny1614位微處理器,通過(guò)一個(gè)7段數(shù)碼管進(jìn)行顯示測(cè)量的電壓,并驅(qū)動(dòng)一個(gè)揚(yáng)聲器發(fā)出聲音,輕觸開(kāi)關(guān)切換不同的邏輯系列,一個(gè)3.3V的穩(wěn)壓器給微處理器提供電源,原理圖見(jiàn)下(使用Eagle繪制)

ef03b224-ff30-11eb-9bcf-12bb97331649.png

這個(gè)設(shè)計(jì)中用到的器件主要有:

微芯科技 ATtiny1614 x1
TSS-307EWA 7-Seg 0.36in CC 顯示器 x1
LM1117-33 3.3V 穩(wěn)壓器(SOT-223封裝) x1
C&K 開(kāi)關(guān) PTS 645 系列開(kāi)關(guān)(6mm軸) x1
SMT-916喇叭 x1
3.6V 400mW 齊納二極管(SOD80C 封裝) x2
1N4007 – 高電壓、高額定電流二極管(SOD-123 包裝) x2
無(wú)源元件:5 個(gè) 180R 0805、1 個(gè) 91R 0805、2 個(gè) 1K 0805、2 個(gè) 3K 0805、1 個(gè) 15K 0805 電阻器;2 x 0.1uF 0805, 1 x 10uF 0805, 1 x 100uF/10V 7343 電容器

作者制作了一個(gè)PCB,單面板,主要器件都是表面貼裝的。7段數(shù)碼管和電路板成直角安裝。

該探針是高度可以配置的,允許添加其它的邏輯系列器件,見(jiàn)下面程序中的截圖部分:

ef8e09e2-ff30-11eb-9bcf-12bb97331649.png

下面是制作的PCB,在國(guó)外制作PCB還是很不方便的。

將縫衣針綁上做探針:

焊上7段數(shù)碼管:

裝上開(kāi)關(guān)和電源連線:

作者用一個(gè)Arduino Nano來(lái)對(duì)其進(jìn)行編程

使用Arduino的IDE:

f027f070-ff30-11eb-9bcf-12bb97331649.png

下面是這個(gè)邏輯分析探針的代碼:

/************************************************************************** ATtiny1614 Logic Probe Schematic & PCB at https://www.hackster.io/john-bradnam/contact-digital-thermometer-ed18d2 2021-08-10 John Bradnam (jbrad2089@gmail.com) Create program for ATtiny1614 -------------------------------------------------------------------------- Arduino IDE: -------------------------------------------------------------------------- BOARD: ATtiny1614/1604/814/804/414/404/214/204 Chip: ATtiny1614 Clock Speed: 20MHz millis()/micros(): "Enabled (default timer)" Programmer: jtag2updi (megaTinyCore) ATTiny1614 Pins mapped to Ardunio Pins +--------+ VCC + 1 14 + GND (SS) 0 PA4 + 2 13 + PA3 10 (SCK) 1 PA5 + 3 12 + PA2 9 (MISO) (DAC) 2 PA6 + 4 11 + PA1 8 (MOSI) 3 PA7 + 5 10 + PA0 11 (UPDI) (RXD) 4 PB3 + 6 9 + PB0 7 (SCL) (TXD) 5 PB2 + 7 8 + PB1 6 (SDA) +--------+ **************************************************************************/ //Debug mode will use the TX pin to send serial messages. As this is also used//for Segment A, the display is disabled when DEBUG mode is enabled//#define DEBUG //Display Pins#define A_PIN 5 //PB2#define B_PIN 4 //PB3#define C_PIN 3 //PA7#define D_PIN 0 //PA4#define EF_PIN 1 //PA5#define G_PIN 2 //PA6 //Inputs#define VIN_PIN 9 //PA2#define PROBE_PIN 8 //PA1#define MODE_PIN 10 //PA3 #define ADC_PROBE ADC_MUXPOS_AIN1_gc#define ADC_VIN ADC_MUXPOS_AIN2_gc //Outputs#define SPKR_PIN 6 //PB1 //Frequency for different states#define VDD_TONE 1760#define HIGH_TONE 880#define LOW_TONE 220#define GND_TONE 110#define BTN_TONE 440 //Pin and mask mapping tabletypedef struct { int8_t pin; int8_t mask;} SEG; #define SEG_COUNT 6SEG segments[] = { {A_PIN, B00000001}, {B_PIN, B00000010}, {C_PIN, B00000100}, {D_PIN, B00001000}, {EF_PIN, B00010000}, {G_PIN, B00100000}}; //Character set#define CHAR_COUNT 10#define CHAR_SPACE 0#define CHAR_VDD 1#define CHAR_HIGH 2#define CHAR_FLOAT 3#define CHAR_LOW 4#define CHAR_GND 5#define CHAR_PULSE 6#define CHAR_CMOS 7#define CHAR_TTL 8#define CHAR_LS 9 uint8_t charset[] = { B00000000, //CHAR_SPACE B00000001, //CHAR_VDD B00000110, //CHAR_HIGH B00100000, //CHAR_FLOAT B00011111, //CHAR_LOW B00001000, //CHAR_GND B00110011, //CHAR_PULSE B00011001, //CHAR_CMOS B00111000, //CHAR_TTL B00011000 //CHAR_LS}; char debugset[] = { ' ', //CHAR_SPACE '+', //CHAR_VDD '1', //CHAR_HIGH '?', //CHAR_FLOAT '0', //CHAR_LOW '-', //CHAR_GND 'P', //CHAR_PULSE 'C', //CHAR_CMOS 'T', //CHAR_TTL 'L' //CHAR_LS}; typedef struct { float low; //Maximum voltage a LOW state can be (fixed voltage) float high; //Minumum voltage a HIGH state can be as a percentage of VDD uint8_t chr; //Character to display for this family} FAMILY; //This table defines the voltage levels for each family that the probe can measure#define NUMBER_OF_FAMILIES 3FAMILY families[NUMBER_OF_FAMILIES] = { {0.8,80,CHAR_CMOS}, //CMOS family with tones {0.4,48,CHAR_TTL}, //0.4, 2.4 (1987 - National LS S TTL Logic Databook) {0.5,54,CHAR_LS} //0.5, 2.7 (1987 - National LS S TTL Logic Databook)}; enum STATES { STATE_UNKNOWN, STATE_VDD, STATE_HIGH, STATE_FLOAT, STATE_LOW, STATE_GND, STATE_PULSE }; #define PULSE_PERIOD 100 //Maximum time between state changes to be detected as a pulse (1/2 the period => 5Hz) uint8_t activeFamily = 0; //Current chip family being testedSTATES lastState = STATE_UNKNOWN; //Last state measuredSTATES activeState = STATE_UNKNOWN; //Current state at probefloat supplyVoltage = 0; //VDD from 3V3 regulatorfloat probeVoltage = 0; //Last reading from probefloat vinVoltage = 0; //Last reading from VINlong pulseTimeout = 0; //Timer used to measure pulsesbool waitingOnChange = false; //Enabled when waiting on pulseTimeoutbool soundEnabled = false; //Whether tones are played for the states //-------------------------------------------------------------------------// Initialise Hardwarevoid setup(void){ for (int i = 0; i < SEG_COUNT; i++) { pinMode(segments[i].pin, OUTPUT); digitalWrite(segments[i].pin, LOW); } #ifdef DEBUG Serial.begin(115200); #endif pinMode(VIN_PIN, INPUT); pinMode(PROBE_PIN, INPUT); pinMode(MODE_PIN, INPUT_PULLUP); pinMode(SPKR_PIN, OUTPUT); //Setup ADC VREF.CTRLA = VREF_ADC0REFSEL_1V1_gc; ADC0.CTRLC = ADC_REFSEL_VDDREF_gc | ADC_PRESC_DIV256_gc; // 78kHz clock ADC0.CTRLA = ADC_ENABLE_bm; // Single, 10-bit measureSupplyVoltage();} //--------------------------------------------------------------------// Main program loopvoid loop(void){ if (buttonPressed()) { activeFamily++; if (activeFamily == NUMBER_OF_FAMILIES) { activeFamily = 0; soundEnabled = !soundEnabled; //Turn/off audio } showChar(families[activeFamily].chr); noTone(SPKR_PIN); if (soundEnabled) { tone(SPKR_PIN, BTN_TONE); } waitForButtonRelease(); noTone(SPKR_PIN); //Force an update waitingOnChange = false; lastState = STATE_UNKNOWN; } testProbe();} //--------------------------------------------------------------------// Test if button pressedbool buttonPressed(){ bool result = false; if (digitalRead(MODE_PIN) == LOW) { delay(10); //Debounce return (digitalRead(MODE_PIN) == LOW); } return result;} //--------------------------------------------------------------------// Wait until the button is releasedvoid waitForButtonRelease(){ while (digitalRead(MODE_PIN) == LOW) ;} //--------------------------------------------------------------------// Measure the voltages and dislay the results if changedvoid testProbe(){ //Voltages are feed through divide by 4 resistor voltage converter //so they need to multiplied by 4. probeVoltage = measureVoltage(ADC_PROBE) * 4; vinVoltage = measureVoltage(ADC_VIN) * 4; //Calculate HIGH and VDD thresholds from VIN voltage float vdd = vinVoltage - 0.1; float high = families[activeFamily].high * vinVoltage / 100; bool pulse = false; //Workout state if (probeVoltage < 0.1) { activeState = STATE_GND; } else if (probeVoltage <= families[activeFamily].low) { activeState = STATE_LOW; } else if (probeVoltage < high) { activeState = STATE_FLOAT; } else if (probeVoltage <= vdd) { activeState = STATE_HIGH; } else { activeState = STATE_VDD; } if (activeState != lastState) //Only do something if state changes { #ifdef DEBUG Serial.println("p=" + String(probeVoltage) + ", vin=" + String(vinVoltage) + ", vdd=" + String(supplyVoltage)); delay(200); #endif if ((activeState == STATE_HIGH) ^ (lastState == STATE_HIGH)) //Change in state from either LOW to HIGH or HIGH to LOW { pulse = (waitingOnChange && millis() < pulseTimeout); //If state change within PULSE_PERIOD signal it as a pulse pulseTimeout = millis() + PULSE_PERIOD; //Set next timeout waitingOnChange = true; //and signal we are waiting on a state change } else { //This isn't a pulse waitingOnChange = false; pulse = false; } //Turn off any sound from the last state noTone(SPKR_PIN); //Show the result int chr = (pulse) ? CHAR_PULSE : (uint8_t)activeState; showChar(chr); if (soundEnabled) //Play sound if enabled { switch(chr) { case CHAR_VDD: tone(SPKR_PIN, VDD_TONE); break; case CHAR_HIGH: tone(SPKR_PIN, HIGH_TONE); break; case CHAR_LOW: tone(SPKR_PIN, LOW_TONE); break; case CHAR_GND: tone(SPKR_PIN, GND_TONE); break; } } //Record last state lastState = activeState; }} //--------------------------------------------------------------------// Display character on 7 segment display// chr - character to show (0 <= chr < CHAR_COUNT)void showChar(uint8_t chr){ if (chr < CHAR_COUNT) { #ifdef DEBUG Serial.println(debugset[chr]); #else uint8_t mask = charset[chr]; for (int i = 0; i < SEG_COUNT; i++) { digitalWrite(segments[i].pin, (mask & segments[i].mask) ? HIGH : LOW); } #endif } } //--------------------------------------------------------------------------// Measure supply voltage// Source: David Johnson-Davies - www.technoblogy.com - 13th April 2021void measureSupplyVoltage() { ADC0.MUXPOS = ADC_MUXPOS_INTREF_gc; // Measure INTREF ADC0.COMMAND = ADC_STCONV_bm; // Start conversion while (ADC0.COMMAND & ADC_STCONV_bm); // Wait for completion uint16_t adc_reading = ADC0.RES; // ADC conversion result supplyVoltage = 1126.4 / adc_reading;} //--------------------------------------------------------------------------// Measure voltage of a given pin// adcMux - ADC_Ax constant for the pin to measurefloat measureVoltage(uint8_t adcMux) { ADC0.MUXPOS = adcMux; // Measure Analog pin ADC0.COMMAND = ADC_STCONV_bm; // Start conversion while (ADC0.COMMAND & ADC_STCONV_bm); // Wait for completion uint16_t adc_reading = ADC0.RES; // ADC conversion result return supplyVoltage * adc_reading / 1024;}

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • CMOS
    +關(guān)注

    關(guān)注

    58

    文章

    5731

    瀏覽量

    235826
  • pcb
    pcb
    +關(guān)注

    關(guān)注

    4324

    文章

    23147

    瀏覽量

    399038
  • 穩(wěn)壓器
    +關(guān)注

    關(guān)注

    24

    文章

    4254

    瀏覽量

    94002
  • TTL
    TTL
    +關(guān)注

    關(guān)注

    7

    文章

    504

    瀏覽量

    70339

原文標(biāo)題:手工打造的邏輯分析探頭

文章出處:【微信號(hào):DBDevs,微信公眾號(hào):數(shù)據(jù)分析與開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是頻譜分析儀

    分析示波器、諧波分析器、頻率特性分析儀或傅里葉分析儀等。現(xiàn)代頻譜分析儀能以模擬方式或數(shù)字方式顯示分析
    發(fā)表于 07-02 07:21

    邏輯分析儀的使用

    邏輯分析儀的使用 本文主要介紹邏輯分析儀的使用步驟與方法,從探頭與被測(cè)系統(tǒng)連接、設(shè)置時(shí)鐘模式和觸發(fā)功能、捕獲、分析、顯示波
    發(fā)表于 11-27 08:50 ?2233次閱讀

    網(wǎng)絡(luò)分析儀基礎(chǔ)

    什么是網(wǎng)絡(luò)分析儀? 史密斯圓圖 散射參數(shù) 高頻器件特性 什么是網(wǎng)絡(luò)分析儀 網(wǎng)絡(luò)分析儀硬件結(jié)構(gòu) 網(wǎng)絡(luò)分析儀內(nèi)部框圖 激勵(lì)源 信號(hào)分離裝置 接收機(jī) 顯示處理單元 網(wǎng)絡(luò)
    發(fā)表于 01-17 17:08 ?97次下載
    網(wǎng)絡(luò)<b class='flag-5'>分析儀</b>基礎(chǔ)

    音頻信號(hào)分析儀簡(jiǎn)介

    音頻信號(hào)分析儀 音頻信號(hào)分析儀 音頻信號(hào)分析儀 音頻信號(hào)分析儀 音頻信號(hào)分析儀
    發(fā)表于 11-13 14:58 ?0次下載

    什么是頻譜分析儀,頻譜分析儀的工作原理是什么,頻譜分析儀怎樣使用?

    示波器、跟蹤示波器、分析示波器、諧波分析器、頻率特性分析儀或傅里葉分析儀等。現(xiàn)代頻譜分析儀能以模擬方式或數(shù)字方式顯示
    發(fā)表于 05-09 14:03 ?1.6w次閱讀

    邏輯分析儀的作用_邏輯分析儀怎么用_邏輯分析儀的使用方法(教程)

    邏輯分析儀是一種類似于示波器的波形測(cè)試設(shè)備,它可以監(jiān)測(cè)硬件電路工作時(shí)的邏輯電平(高或低),并加以存儲(chǔ),用圖形的方式直觀地表達(dá)出來(lái),便于用戶檢測(cè),分析電路設(shè)計(jì)(硬件設(shè)計(jì)和軟件設(shè)計(jì)) 中的
    發(fā)表于 12-20 16:23 ?5.1w次閱讀

    功率分析儀作用_功率分析儀分類

    功率分析儀主要用來(lái)測(cè)量電機(jī)、變頻器、變壓器等功率轉(zhuǎn)換裝置的功率、效率等參量。被廣泛用于混合動(dòng)力電動(dòng)汽車、電動(dòng)車、太陽(yáng)發(fā)電、風(fēng)力發(fā)電、變頻器、變頻電機(jī)和燃料電池等的測(cè)試。部分分析儀,如WP4000變頻功率
    發(fā)表于 12-19 13:57 ?3978次閱讀

    如何選擇頻譜分析儀和維修頻譜分析儀的故障分析

    以下內(nèi)容中,小編將對(duì)頻譜分析儀的相關(guān)內(nèi)容進(jìn)行著重介紹和闡述,主要內(nèi)容在于如何選擇一款頻譜分析儀和如何解決頻譜分析儀的失鎖故障。希望本文幫您增進(jìn)對(duì)頻譜
    的頭像 發(fā)表于 02-13 17:27 ?4307次閱讀
    如何選擇頻譜<b class='flag-5'>分析儀</b>和維修頻譜<b class='flag-5'>分析儀</b>的故障<b class='flag-5'>分析</b>

    邏輯分析儀是干啥用的 邏輯分析儀的主要用途 邏輯分析儀的應(yīng)用場(chǎng)景

    。它主要用于對(duì)數(shù)字信號(hào)進(jìn)行采樣、分析、存儲(chǔ),這樣可以幫助工程師快速找到電路中出現(xiàn)的問(wèn)題,提高測(cè)試效率,降低開(kāi)發(fā)成本。 邏輯分析儀的主要用途: 1.電子產(chǎn)品設(shè)計(jì)和開(kāi)發(fā):邏輯分析儀是電子產(chǎn)
    的頭像 發(fā)表于 09-19 16:03 ?3320次閱讀

    邏輯分析儀如何使用 邏輯分析儀使用教程

    邏輯分析儀如何使用 邏輯分析儀使用教程? 邏輯分析儀是一種用來(lái)監(jiān)測(cè)和分析數(shù)字信號(hào)的工具。它可以用來(lái)識(shí)別和解決電路故障,幫助做出可靠的設(shè)計(jì)決策
    的頭像 發(fā)表于 09-19 16:03 ?3013次閱讀

    音頻分析儀的原理

    公司主營(yíng)出售/回收:示波器、頻譜分析儀、網(wǎng)絡(luò)分析儀、信號(hào)發(fā)生器、萬(wàn)用表/示波器校準(zhǔn)、手機(jī)綜合測(cè)試、噪聲系數(shù)分析儀、數(shù)據(jù)采集器、NI-GP
    的頭像 發(fā)表于 03-29 11:12 ?841次閱讀

    邏輯分析儀可以當(dāng)示波器用嗎

    測(cè)量和分析數(shù)字信號(hào)的電子測(cè)量?jī)x器。它可以同時(shí)測(cè)量多個(gè)數(shù)字信號(hào),并以圖形或波形的形式顯示測(cè)量結(jié)果。 功能 邏輯分析儀的主要功能包括: (1)測(cè)量多個(gè)數(shù)字信號(hào):邏輯分析儀可以同時(shí)測(cè)量多個(gè)數(shù)字信號(hào),如
    的頭像 發(fā)表于 07-17 16:55 ?1186次閱讀

    邏輯分析儀multisim的應(yīng)用

    電子電路。 邏輯分析儀是一種用于測(cè)試和分析數(shù)字電路的儀器,它可以捕獲和顯示數(shù)字信號(hào)的波形,幫助用戶診斷電路問(wèn)題。Multisim中也包含了邏
    的頭像 發(fā)表于 07-18 09:13 ?988次閱讀

    Keysight 頻譜分析儀(信號(hào)分析儀

    Keysight頻譜分析儀(信號(hào)分析儀)足夠的性能和卓越的可靠性,幫助您更輕松、更快速地應(yīng)對(duì)常見(jiàn)的射頻-微波測(cè)試測(cè)量挑戰(zhàn)。可靠的頻譜分析儀和信號(hào)分析儀提供準(zhǔn)確可信的測(cè)量結(jié)果無(wú)論您是要在
    的頭像 發(fā)表于 09-12 08:10 ?541次閱讀
    Keysight 頻譜<b class='flag-5'>分析儀</b>(信號(hào)<b class='flag-5'>分析儀</b>)

    頻譜分析儀與信號(hào)分析儀的區(qū)別

    在現(xiàn)代電子通信領(lǐng)域,頻譜分析儀和信號(hào)分析儀是兩種不可或缺的測(cè)試工具。它們都用于測(cè)量和分析信號(hào)的特性,但它們的功能、應(yīng)用和工作原理存在顯著差異。 一、定義與基本原理 頻譜分析儀 是一種用
    的頭像 發(fā)表于 11-27 15:26 ?659次閱讀
    主站蜘蛛池模板: 一级毛片在线不卡直接观看| 国产乱人视频免费播放| 国产九九热| 色天天干| 一区在线观看| freesex性| 男人天堂伊人| 日本番囗| 色综合成人丁香| 九九福利| 天堂w| 午夜亚洲国产| www.色com| 污视频日本| 小泽玛利亚在线观看123| 搞逼综合网| 国产在线一卡| 老司机成人精品视频lsj| 日本特黄特色免费大片| 色播图片| 色噜噜久久| 色国产视频| 免费看 s色| 激情五月婷婷综合| 来啊mm影院亚洲mm影院| 国产精品视频一区二区三区| 国产好深好硬好爽我还要视频| tv天堂| 久久精品国产免费| h视频免费高清在线观看| 一区二区三区视频在线| 亚洲视频二| 蝌蚪自拍网二区| 很黄很污的视频网站| 99精品热| 午夜欧美日韩| 五月激情片| 日韩亚洲人成网站在线播放| 欧美性天天影院| 久久综合九色综合欧美播| 1024成人|