女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用LocalDate和LocalDateTime

Android編程精選 ? 來源:Android編程精選 ? 作者:Android編程精選 ? 2022-07-04 11:34 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

史蒂夫.喬布斯說,”復雜的終極境界是簡單“,同樣的優雅的代碼一定是精簡明了,可讀性好。

使用LocalDate和LocalDateTime

LocalDate精確到日期,LocalDateTime精確到時分秒。優化前14行代碼


	
  1. try {

  2. SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd");

  3. SimpleDateFormat sdfMins = new SimpleDateFormat("yyyy-MM-dd HHss");

  4. Date now = new Date();

  5. String today = sdfDay.format(now);

  6. String waterStart = today + " 0300";

  7. String waterEnd = today + " 0400";

  8. Date waterStartTime = sdfMins.parse(waterStart);

  9. Date waterEndTime = sdfMins.parse(waterEnd);

  10. } catch (ParseException pe) {

  11. return XX;

  12. }

優化后3行代碼


	
  1. LocalDateTime now = LocalDateTime.now();

  2. LocalDateTime waterStart = LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),3,0);

  3. LocalDateTime waterEndTime =LocalDateTime.of(now.getYear(), now.getMonth(),now.getDayOfMonth(),4,0);

默認值使用Optional

優化前五行


	
  1. if (null == status) {

  2. param.put("status", new ArrayList<String>());

  3. } else {

  4. param.put("status", status);

  5. }

優化后一行,使用JDK8的Optional


	
  1. Optional.ofNullable(status).orElse(new ArrayList<String>());

如果是字符串可以用


	
  1. StringUtils.defaultIfEmpty(status,"")

字符串累加

字符串只要不在for循環里累加,可以直接用+號,因為編譯成字節碼后會變成StringBuilder,如果在for循環里面用+號會生成多個StringBuilder,所以在for循環里累加最好在循環外創建StringBuilder。優化前五行


	
  1. StringBuffer sblog = new StringBuffer();

  2. sblog.append("waterDriven|sellerId=");

  3. sblog.append(request.getSellerTaobaoId());

  4. sblog.append("|result=");

  5. sblog.append(isSuccess);

優化后一行


	
  1. String sblog="waterDriven|sellerId="+request.getSellerTaobaoId()+"|result="+isSuccess;

以上場景用逗號和等號連接數據,使用GUAVA的Joiner更精簡,可讀性更好


	
  1. String sblog=Joiner.on("|").withKeyValueSeparator("=").join(ImmutableMap.of("sellerId", request.getSellerTaobaoId(), "result", isSuccess))

LIST TO MAP

優化前4行


	
  1. Map<String, String> AssetsMetaIdMap = Maps.newHashMap();

  2. for (AssetsInfoBO assetsInfoBO : request.getAssetsCollectionList()) {

  3. AssetsMetaIdMap.put(assetsInfoBO.getAssetMetadataId(), assetsInfoBO.getAssetMetadataId());

  4. }

優化后1行


	
  1. Map<String, String> AssetsMetaIdMap = request.getAssetsCollectionList().stream().collect(Collectors.toMap(Hosting::getAssetMetadataId, Hosting::getAssetMetadataId));

如果key重復會拋出異常


	
  1. Exception in thread "main" java.lang.IllegalStateException: Duplicate key 80000

減少不需要的判斷

優化前5行


	
  1. String requestId = null;

  2. if (null != request.getExtData()) {

  3. requestId = request.getExtDataValue(REQUEST_ID_KEY);

  4. }

  5. return requestId;

優化后1行


	
  1. return request.getExtDataValue(REQUEST_ID_KEY);

去掉else

優化前5行


	
  1. if (null != result && StringUtils.isNotBlank(no)) {

  2. return no;

  3. } else {

  4. throw new RuntimeException("XX");

  5. }

優化后4行


	
  1. if (null != result && StringUtils.isNotBlank(no)) {

  2. return no;

  3. }

  4. throw new RuntimeException("XX");

不要返回布爾

優化前5行


	
  1. if ("true".equalsIgnoreCase(value.toString())) {

  2. invoke = true;

  3. } else {

  4. invoke = false;

  5. }

優化后一行


	
  1. invoke = "true".equalsIgnoreCase(value.toString());

使用級聯

優化前5行


	
  1. ParamBO paramBO = new ParamBO();

  2. paramBO.setId(1);

  3. paramBO.setName(”ifeve“);

  4. paramBO.setOld(7);

優化后1行


	
  1. new ParamBO().withId(1).withName("ifeve").withOld(7);

-End-

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4898

    瀏覽量

    70585
  • LOCA
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7237

原文標題:幾個代碼瘦身優化的案例

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    花20億收購一家上市公司,“稚暉君”速通科創板

    電子發燒友網報道(文/梁浩斌)科創板人形機器人第一股就這么誕生了?智元機器人“借殼”科創板上市公司上緯新材上市,成為“人形機器人第一股”的消息在7月8日晚上開始快速發酵,9日早上上緯新材開盤直接20cm漲停,封單金額甚至一度超過其總市值。 ? 不過智元機器人相關人士回應稱“非借殼上市,只是收購了一家上市公司”。所以到底是怎么回事? ? 約20 億收購63.62% 股權,前華為副總裁操盤 ? 7月8日晚間,上緯新材連發多個公告,宣布智元
    的頭像 發表于 07-10 00:22 ?1694次閱讀
    花20億收購一家上市公司,“稚暉君”速通科創板

    第十三屆半導體設備與核心部件及材料展(CSEAC 2025)9月無錫開幕

    2025年9月4日至6日,第十三屆半導體設備與核心部件及材料展(CSEAC 2025),將在無錫太湖國際博覽中心舉行。 CSEAC以“專業化、產業化、國際化”為宗旨,是我國半導體設備與核心部件及材料領域最具知名度的年度性展會,集“技術交流、展覽展示、產品發布、經貿洽談、國際合作及市場拓展”于一體的產業盛宴。今年呈現五大亮點: ? 亮點一:規模盛大,映射中國半導體勢不可擋 CSEAC 2025 規劃晶圓制造設備、封測設備、核心部件、材料等主題展區, 展
    發表于 07-10 08:55 ?21次閱讀
    第十三屆半導體設備與核心部件及材料展(CSEAC 2025)9月無錫開幕

    重磅!英偉達800V高壓直流架構革新AI數據中心,三大功率GaN大廠新品揭秘

    電子發燒友原創 章鷹 GaN作為一種性能優異的寬禁帶半導體材料,近年來在功率半導體市場備受關注,從消費電子快充領域崛起,到如今的AI服務器、人形機器人等新興市場應用,氮化鎵器件正在顯示強大的發展潛力。最近兩家大廠在氮化鎵領域新動態引發了業界的關注。 5月21日, 納微半導體美股盤后上漲了超202%,導致股價上漲的最重要原因之一是英飛凌和納微結成的戰略合作, 5月20日,英偉達與納微宣布構建合作伙伴關系,開發基于全新架構的下一
    的頭像 發表于 07-10 00:19 ?1448次閱讀
    重磅!英偉達800V高壓直流架構革新AI數據中心,三大功率GaN大廠新品揭秘

    瀾起科技率先發力CXL MXC、PCIe Switch芯片

    電子發燒友網綜合報道,日前,瀾起科技控股子公司瀾起電子科技(珠海橫琴)有限公司擬進行增資擴股。橫琴公司注冊資本擬由人民幣10,000萬元增加至人民幣13,350萬元,新增注冊資本額為人民幣3,350萬元,本輪增資方合計增資人民幣10,050萬元。其中,公司擬出資人民幣4,020萬元,認購橫琴公司新增注冊資本人民幣1,340萬元。本次增資擴股完成后,公司對橫琴公司的持股比例由51.00%變更為 48.24%,由于公司仍能夠決定橫琴公司董事會半數以上成員的當選,故
    的頭像 發表于 07-10 00:17 ?589次閱讀

    有一家機器人企業IPO!年銷695萬臺傳感器,海外割草機器人撬動新增長

    (電子發燒友網綜合報道)今年,資本市場再度升溫,掀起新一輪上市熱潮。多家機器人企業紛紛尋求IPO上市,其中港股市場已成為眾多企業的首選。據香港聯交所數據,已有超過10家機器人及相關產業鏈企業披露招股書,包括樂動機器人、臥安機器人等。其中樂動機器人于6月向港交所遞交招股書,它是一家機器人傳感器供應商。 ? ? 2029 年市場規模破700 億,樂動機器人深度布局視覺感知技術 在視覺感知領域,樂動機器人的技術優勢包括其行業首創的
    的頭像 發表于 07-10 00:15 ?1641次閱讀
    有一家機器人企業IPO!年銷695萬臺傳感器,海外割草機器人撬動新增長

    再定三項電力儲能國際標準,中國開始掌握儲能話語權

    電子發燒友網綜合報道 近日,由我國牽頭制定的電力儲能領域《電力儲能系統第2—3部分電力儲能系統運行性能測試》《電力儲能系統第3—200部分電化學儲能系統設計原則》《電力儲能系統第4—2部分電池故障的環境影響評估》3項國際標準正式發布。 ? 三項標準覆蓋了儲能系統運行性能測試(IEC 62640-2-3)、電化學設計原則(IEC 62640-3-200)、電池故障環境影響評估(IEC 62640-4-2),首次構建了儲能全鏈條國際標準體系。此前國際標準在性能動態評估、環境
    的頭像 發表于 07-10 00:14 ?469次閱讀

    三星電子業績下滑,這個“鍋”誰來背?

    電子發燒友網報道(文 / 吳子鵬)回顧 SK 海力士 2024 年的財報,營業收入為 66.1930 萬億韓元,營業利潤為 23.4673 萬億韓元(營業利潤率為 35%),凈利潤為 19.7969 萬億韓元(凈利潤率為 30%),創下了有史以來最佳年度業績。再看臺積電的財報,2024 財年營業收入為 901.16 億美元,同比增加 29.94%;凈利潤為 365.30 億美元,同比增加 35.80%。 ? 那么,同樣布局 HBM 和晶圓代工的三星一定會表現很好吧?答案是否定的。根據三星電子當地時間 7 月 8 日公布的業績
    的頭像 發表于 07-10 00:12 ?1469次閱讀

    【VisionFive 2單板計算機試用體驗】1、開箱初體驗(刷系統+靜態IP設置+GPU跑分測評)

    衷心感謝電子發燒友論壇! 1、開箱刷系統 開箱圖片 大概手掌大小,雙網口,四個USB口,外設資源很充足。要是能再加個WIFI和藍牙模塊就完美了。 刷系統 搞了一張64G的TF卡 準備以下文件:注意:balenaEtcher這個軟件表面上可以選擇bz2文件,但是在軟件內解壓的話會卡在73%的進度。所以,bz2文件要先解壓,再用balenaEtcher燒錄鏡像到TF卡。 開機設置靜態IP 一般來說,我會把板卡設置成固定的局域網IP,這樣在充當一些服務的時候,比如NAS,訪問它的時候比較方便。 進入路由器管理界面,為設備MAC地址預留IP地址,這樣每次板卡啟動都會被分配到這個IP地址上。 GPU跑分 首先用clinfo命令查看一下GPU,當然也可以在debain-system setting-about界面看到BXE-4-32GPU benchmark軟件一般用glmark2。glmark2在編譯的時候會有不同的flavor。這里解釋一下幾種選項: x11或wayland,這個根據我們系統是用哪種協議的顯示界面,我們在燒錄鏡像的時候選擇的是wayland的桌面協議,所以flavor要選wayland。 gl或gles2,這個代表OpenGL還是OpenGL ES,我們知道VisonFive2的顯卡是支持的是后者,所以這個應該選gles2 還有一種drm,這個代表無圖形界面 比較奇怪的是: 不管是glmark2還是glmark2-es2-wayland,都會顯示測試的RENDERER是softpipe,這代表渲染測試用的是純CPU,跑分會很低。正常應該識別為BXE-4-32,有可能是鏡像的問題。這個已經反饋給星昉的工作人員去詢問了。
    發表于 07-09 21:50

    【創龍TL3562-MiniEVM開發板試用體驗】Grove移植3之LED

    關鍵修改 在source/common.c中,增加如下代碼 示例代碼 運行 結果
    發表于 07-09 21:38

    【創龍TL3562-MiniEVM開發板試用體驗】Grove移植2 底層資源學習

    1 瑞芯微GPIO引腳定義 1.1 引腳命名 GPIO{bank}{letter}{number}{mode} GPIO0_C1_d GPIO0:表示第0組GPIO控制器(RK3568有多個GPIO控制器,如GPIO0、GPIO1等)。 字母部分(C):表示GPIO組內的子組(如A、B、C、D),對應不同的引腳偏移,如32個引腳,分成A,B,C,D四組 數字部分(1):表示在該子組中的引腳序號(從0開始)。 _d:可能表示引腳的復用功能模式(如_a, _b, _c, _d等) 即下面GPIO4_D5 pin腳計算方法: bank = 4;//GPIO4_D5 => 4, bank ∈ [0,4] group = 3;//GPIO4_D5 => 3, group ∈ {(A=0), (B=1), (C=2), (D=3)} X = 5; //GPIO4_D5 => 5, X ∈ [0,7] number = group * 8 + X = 3 * 8 + 5 = 29 pin = bank*32 + number= 4 * 32 + 29 = 157; 1.2 調試信息 查看當前使用的引腳 root@RK3562-Tronlong:~# cat /sys/kernel/debug/gpio gpiochip0: GPIOs 0-31, parent: platform/ff260000.gpio, gpio0: gpio-5(|heartbeat) out lo gpio-6(|disk ) out lo gpio-8(|vcc5v0-usb-otg) out lo gpio-19(|vcc3v3-lcd0-n ) out lo gpiochip1: GPIOs 32-63, parent: platform/ff620000.gpio, gpio1: gpiochip2: GPIOs 64-95, parent: platform/ff630000.gpio, gpio2: gpiochip3: GPIOs 96-127, parent: platform/ffac0000.gpio, gpio3: gpio-113 (|ch482d_sel ) out lo ACTIVE LOW gpiochip4: GPIOs 128-143, parent: platform/ffad0000.gpio, gpio4: gpio-137 (|user-led0) out lo gpio-143 (|user-led1) out lo gpiochip5: GPIOs 511-511, parent: platform/rk805-pinctrl, rk817-gpio, can sleep: 查看當前配置的引腳 root@RK3562-Tronlong:~# ls /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl gpio-rangespinconf-pinspinmux-functionspins pinconf-groupspingroupspinmux-pins 1.3配置 默認,在設備樹文件tl3562-minievm.dts中,將所有的擴展引腳皆配置為gpio export-pins { export_pins_gpio: export_pins_gpio { rockchip,pins = < 0 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none 0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none 0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none 0 RK_PC7 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none 4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none 4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none 1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none 4 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none 3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_none>; }; }; 即對應的J8引腳為 1.4 控制引腳 :/ # ls /sys/class/gpio/ exportgpiochip128gpiochip32gpiochip64unexport gpiochip0gpiochip255gpiochip500gpiochip96 :/ # echo 157 > /sys/class/gpio/export :/ # ls /sys/class/gpio/ exportgpiochip0 gpiochip255gpiochip500gpiochip96 gpio157gpiochip128gpiochip32gpiochip64unexport :/ # ls /sys/class/gpio/gpio157 ative_lowdevicedirectionedgepowersubsystemueventvalue :/ # cat /sys/class/gpio/gpio157/direction in :/ # cat /sys/class/gpio/gpio157/value 0 2 pwm控制 2.1 配置 以pwm7為例,默認rk3562.dtsi配置如下 pwm7: pwm@ff700030 { compatible = \"rockchip,rk3562-pwm\", \"rockchip,rk3328-pwm\"; reg = <0x0 0xff700030 0x0 0x10>; interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = \"active\"; pinctrl-0 = <&pwm7m0_pins>; clocks = <&cru CLK_PWM1_PERI>, <&cru PCLK_PWM1_PERI>; clock-names = \"pwm\", \"pclk\"; status = \"disabled\"; }; 即使用pwm7m0_pins引腳配置,它在rk3562-pintrl.dtsi中定義如下 pwm7 { /omit-if-no-ref/ pwm7m0_pins: pwm7m0-pins { rockchip,pins = /* pwm7_m0 */ <0 RK_PC0 2 &pcfg_pull_none_drv_level_1>; }; /omit-if-no-ref/ pwm7m1_pins: pwm7m1-pins { rockchip,pins = /* pwm7_m1 */ <1 RK_PD4 4 &pcfg_pull_none_drv_level_1>; }; }; 即使用GPIO0_C0引腳,正好與原理圖的J8_3相對應 3.2 控制 如下所示,可以到/sys/class/pwm/下控制,也可以到具體的/sys/devices/platform/xx/pwm/下控制,它們通過軟鏈接指向同一個 root@RK3562-Tronlong:~# cd /sys/class/pwm/ root@RK3562-Tronlong:/sys/class/pwm# ls -al total 0 drwxr-xr-x2 root root 0 Jun 18 04:29 . drwxr-xr-x 76 root root 0 Jun 18 04:29 .. lrwxrwxrwx1 root root 0 Jun 18 04:29 pwmchip0 -> ../../devices/platform/ff230030.pwm/pwm/pwmchip0 lrwxrwxrwx1 root root 0 Jun 18 04:29 pwmchip1 -> ../../devices/platform/ff700000.pwm/pwm/pwmchip1 lrwxrwxrwx1 root root 0 Jun 18 04:29 pwmchip2 -> ../../devices/platform/ff700030.pwm/pwm/pwmchip2 root@RK3562-Tronlong:/sys/class/pwm# cd /sys/devices/platform/ff700030.pwm/pwm/ root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm# ls pwmchip2 root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm# cd pwmchip2/ root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm/pwmchip2# ls deviceexportnpwmpowersubsystemueventunexport root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm/pwmchip2# echo 0 >export root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm/pwmchip2# cd pwm0 root@RK3562-Tronlong:/sys/devices/platform/ff700030.pwm/pwm/pwmchip2/pwm0# ls captureduty_cycleenableoutput_typeperiodpolaritypoweruevent 3 adc控制 3.1 配置 默認支持8通道10位的saadc,配置如下 saradc0: saradc@ff730000 { compatible = \"rockchip,rk3562-saradc\"; reg = <0x0 0xff730000 0x0 0x100>; interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>; #io-channel-cells = <1>; clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>; clock-names = \"saradc\", \"apb_pclk\"; resets = <&cru SRST_P_SARADC>; reset-names = \"saradc-apb\"; status = \"disabled\"; }; 對的J9如下所示 3.2 控制 root@RK3562-Tronlong:~# cd /sys/bus/iio/devices/iio iio:device0/ iio:device1/ iio_sysfs_trigger/ root@RK3562-Tronlong:~# cd /sys/bus/iio/devices/iio:device0 root@RK3562-Tronlong:/sys/bus/iio/devices/iio:device0# ls bufferin_voltage2_rawin_voltage6_rawof_nodetrigger devin_voltage3_rawin_voltage7_rawpower uevent in_voltage0_rawin_voltage4_rawin_voltage_scalescan_elements in_voltage1_rawin_voltage5_rawnamesubsystem 4 i2c控制 4.1 配置 以i2c3為例子,默認rk3562.dtsi配置為 i2c3: i2c@ffa20000 { compatible = \"rockchip,rk3562-i2c\", \"rockchip,rk3399-i2c\"; reg = <0x0 0xffa20000 0x0 0x1000>; clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>; clock-names = \"i2c\", \"pclk\"; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; pinctrl-names = \"default\"; pinctrl-0 = <&i2c3m0_xfer>; #address-cells = <1>; #size-cells = <0>; status = \"disabled\"; }; 即使用i2c3m0_xfer引腳配置,它在rk3562-pintrl.dtsi中定義如下 i2c3 { /omit-if-no-ref/ i2c3m0_xfer: i2c3m0-xfer { rockchip,pins =/* i2c3_scl_m0 */ <3 RK_PA0 1 &pcfg_pull_none_smt>, /* i2c3_sda_m0 */ <3 RK_PA1 1 &pcfg_pull_none_smt>; }; /omit-if-no-ref/ i2c3m1_xfer: i2c3m1-xfer { rockchip,pins = /* i2c3_scl_m1 */ <4 RK_PA5 5 &pcfg_pull_none_smt>, /* i2c3_sda_m1 */ <4 RK_PA6 5 &pcfg_pull_none_smt>; }; }; 即使用GPIO3_A0和GPIO3_A1引腳,正好與原理圖的J8_13/J8_15相對應 但這里有個問題,縱觀整個原理圖,i2c沒有硬件上位,故需要修改引腳配置 /omit-if-no-ref/ i2c3m0_xfer: i2c3m0-xfer { rockchip,pins = /* i2c3_scl_m0 */ <3 RK_PA0 1 &pcfg_pull_up>, /* i2c3_sda_m0 */ <3 RK_PA1 1 &pcfg_pull_up>; }; 4.2 控制 通過設備節點控制 root@RK3562-Tronlong:~# ls /dev/i2c- i2c-0i2c-1i2c-2i2c-3 也可以通過i2ctools工具通過 i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE] # I2C addresses backlight=0x62 # backlight registers mode1=0x00 i2cset -y 1 $backlight $mode1 0x00
    發表于 07-09 21:22

    【BPI-CanMV-K230D-Zero開發板體驗】視頻會議場景下的 AI 應用(電子云臺 EPTZ、人像居中 / 追蹤、畫中畫)

      近幾年由于各種原因,很多的會議都轉到了線上,各種視頻會議軟件用戶也都呈幾何倍數增長。   視頻會議場景下,對于音視頻處理都有一定要求,AI 時代下,人們已經不僅僅滿足于聽的到,看的到。而是更加注重“臨場感” 視頻會議場景對畫面處理有很多需求,常見的如下: 1、電子云臺 EPTZ   傳統云臺通過 XY 軸電機移動鏡頭,變焦電機縮放畫面,來達到看清指定區域的目的。“電子云臺”功能通過電子裁剪縮放模擬機械云臺,可以使畫面移動/縮放到指定位置上,也可以實現想要的運鏡效果。 2、人像居中 / 追蹤 Center Stage   在人物走動時,“人物居中”功能可協助將人像保持在畫面中間。例如在講臺下,人物居中功能可將教師人像保持在畫面中間,并且相比全景畫面能看到更多教師動作細節。   蘋果設備在近年也推出了人像居中功能來提供更好的視頻通話體驗。 3、畫中畫 PIP   當參會者既想看清舞臺上人物表情細節,又想看清整個舞臺畫面時,“畫中畫”功能就提供了這種優勢?!爱嬛挟嫛蓖ㄟ^在畫面上疊加一個全景畫面,來達到同時看清人物細節和舞臺全景的效果。   除此之外,會議場景還有諸多 AI 應用,例如 參會人數統計、多人像分屏、背景虛化、背景替換、語音轉字幕、回聲消除、降噪 等,通過 K230 強大的 AI 算力,都可以做到一定程度的模擬。 功能實現   K230 例程中實現 AI 功能基本都是基于 PipeLine 模塊,該模塊封裝了單攝雙通道默認配置,一路將 Camera 的圖像直接送給 Display 模塊顯示;另一路使用 get_frame 接口獲取一幀圖像供 AI 程序使用。AI 處理后以 OSD 的方式貼到 Display 模塊送顯。   但這里不宜使用 PipeLine 模塊或者需要修改 PipeLine 模塊,因為這里兩路都需要進行處理后送顯,而不能直接送顯。   這里就需要直接使用單攝出雙通道數據,一路低分辨率送 AI 處理,另一路高分辨率經過一定處理后送顯。 出兩路視頻流的代碼如下: sensor = Sensor(width=1920, height=1080)# 構建一個默認配置的Sensor對象 sensor.reset()# 重置傳感器 sensor.set_framesize(width=800, height=480, chn=CAM_CHN_ID_0)# 設置chn0輸出大小為800x480 sensor.set_pixformat(Sensor.RGB565)# 設置chn0輸出格式 sensor.set_framesize(width=320, height=240, chn=CAM_CHN_ID_1)# 設置chn1輸出大小為320x240 sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1)# 設置chn1輸出格式 這里一路會進行裁剪和縮放,最終送顯,另一路送到 AI 模塊,識別人臉坐標位置。 代碼如下: from libs.PipeLineAF import PipeLine, ScopedTiming from libs.AIBase import AIBase from libs.AI2D import Ai2d import os import ujson from media.media import * from time import * import nncase_runtime as nn import ulab.numpy as np import time import utime import image import random import gc import sys import aidemo # 自定義人臉檢測類,繼承自AIBase基類 class FaceDetectionApp(AIBase): def __init__(self, kmodel_path, model_input_size, anchors, confidence_threshold=0.5, nms_threshold=0.2, rgb888p_size=[224,224], display_size=[1920,1080], debug_mode=0): super().__init__(kmodel_path, model_input_size, rgb888p_size, debug_mode)# 調用基類的構造函數 self.kmodel_path = kmodel_path# 模型文件路徑 self.model_input_size = model_input_size# 模型輸入分辨率 self.confidence_threshold = confidence_threshold# 置信度閾值 self.nms_threshold = nms_threshold# NMS(非極大值抑制)閾值 self.anchors = anchors# 錨點數據,用于目標檢測 self.rgb888p_size = [ALIGN_UP(rgb888p_size[0], 16), rgb888p_size[1]]# sensor給到AI的圖像分辨率,并對寬度進行16的對齊 self.display_size = [ALIGN_UP(display_size[0], 16), display_size[1]]# 顯示分辨率,并對寬度進行16的對齊 self.debug_mode = debug_mode# 是否開啟調試模式 self.ai2d = Ai2d(debug_mode)# 實例化Ai2d,用于實現模型預處理 self.ai2d.set_ai2d_dtype(nn.ai2d_format.NCHW_FMT, nn.ai2d_format.NCHW_FMT, np.uint8, np.uint8)# 設置Ai2d的輸入輸出格式和類型 # 配置預處理操作,這里使用了pad和resize,Ai2d支持crop/shift/pad/resize/affine,具體代碼請打開/sdcard/app/libs/AI2D.py查看 def config_preprocess(self, input_image_size=None): #with ScopedTiming(\"set preprocess config\", self.debug_mode > 0):# 計時器,如果debug_mode大于0則開啟 ai2d_input_size = input_image_size if input_image_size else self.rgb888p_size# 初始化ai2d預處理配置,默認為sensor給到AI的尺寸,可以通過設置input_image_size自行修改輸入尺寸 top, bottom, left, right = self.get_padding_param()# 獲取padding參數 self.ai2d.pad([0, 0, 0, 0, top, bottom, left, right], 0, [104, 117, 123])# 填充邊緣 self.ai2d.resize(nn.interp_method.tf_bilinear, nn.interp_mode.half_pixel)# 縮放圖像 self.ai2d.build([1,3,ai2d_input_size[1],ai2d_input_size[0]],[1,3,self.model_input_size[1],self.model_input_size[0]])# 構建預處理流程 # 自定義當前任務的后處理,results是模型輸出array列表,這里使用了aidemo庫的face_det_post_process接口 def postprocess(self, results): #with ScopedTiming(\"postprocess\", self.debug_mode > 0): post_ret = aidemo.face_det_post_process(self.confidence_threshold, self.nms_threshold, self.model_input_size[1], self.anchors, self.rgb888p_size, results) if len(post_ret) == 0: return post_ret else: return post_ret[0] # 繪制檢測結果到畫面上 def draw_result(self, pl, dets): #with ScopedTiming(\"display_draw\", self.debug_mode > 0): if dets: pl.osd_img.clear()# 清除OSD圖像 for det in dets: # 將檢測框的坐標轉換為顯示分辨率下的坐標 x, y, w, h = map(lambda x: int(round(x, 0)), det[:4]) x = x * self.display_size[0] // self.rgb888p_size[0] y = y * self.display_size[1] // self.rgb888p_size[1] w = w * self.display_size[0] // self.rgb888p_size[0] h = h * self.display_size[1] // self.rgb888p_size[1] pl.osd_img.draw_rectangle(x, y, w, h, color=(255, 255, 0, 255), thickness=2)# 繪制矩形框 else: pl.osd_img.clear() # 獲取padding參數 def get_padding_param(self): dst_w = self.model_input_size[0]# 模型輸入寬度 dst_h = self.model_input_size[1]# 模型輸入高度 ratio_w = dst_w / self.rgb888p_size[0]# 寬度縮放比例 ratio_h = dst_h / self.rgb888p_size[1]# 高度縮放比例 ratio = min(ratio_w, ratio_h)# 取較小的縮放比例 new_w = int(ratio * self.rgb888p_size[0])# 新寬度 new_h = int(ratio * self.rgb888p_size[1])# 新高度 dw = (dst_w - new_w) / 2# 寬度差 dh = (dst_h - new_h) / 2# 高度差 top = int(round(0)) bottom = int(round(dh * 2 + 0.1)) left = int(round(0)) right = int(round(dw * 2 - 0.1)) return top, bottom, left, right if __name__ == \"__main__\": # 顯示模式,默認\"hdmi\",可以選擇\"hdmi\"和\"lcd\" display_mode=\"lcd\" # k230保持不變,k230d可調整為[640,360] rgb888p_size = [1920, 1080] if display_mode==\"hdmi\": display_size=[1920,1080] else: display_size=[800,480] # 設置模型路徑和其他參數 kmodel_path = \"/sdcard/examples/kmodel/face_detection_320.kmodel\" # 其它參數 confidence_threshold = 0.5 nms_threshold = 0.2 anchor_len = 4200 det_dim = 4 anchors_path = \"/sdcard/examples/utils/prior_data_320.bin\" anchors = np.fromfile(anchors_path, dtype=np.float) anchors = anchors.reshape((anchor_len, det_dim)) # 初始化PipeLine,用于圖像處理流程 pl = PipeLine(rgb888p_size=rgb888p_size, display_size=display_size, display_mode=display_mode) pl.create()# 創建PipeLine實例 # 初始化自定義人臉檢測實例 face_det = FaceDetectionApp(kmodel_path, model_input_size=[320, 320], anchors=anchors, confidence_threshold=confidence_threshold, nms_threshold=nms_threshold, rgb888p_size=rgb888p_size, display_size=display_size, debug_mode=0) face_det.config_preprocess() # 配置預處理 while True: #with ScopedTiming(\"total\",1): img = pl.get_frame()# 獲取當前幀數據 res = face_det.run(img)# 推理當前幀 print(res) #face_det.draw_result(pl, res)# 繪制結果 pl.draw_image(res)# 顯示結果 gc.collect()# 垃圾回收 face_det.deinit()# 反初始化 pl.destroy() # 銷毀PipeLine實例
    發表于 07-09 20:56

    【VisionFive 2單板計算機試用體驗】SD卡分區

    適用場景 :RVspace防-星光2單板計算機(Debian11),SD卡根分區擴容 核心原理 三步操作流程 : graph LR A[刪除舊分區] --> B[重建分區-保持起始扇區] --> C[resize2fs擴展文件系統] 關鍵規則 : 分區起始扇區必須保持不變(否則系統無法啟動) 結束扇區必須設為磁盤最大值 必須保留ext4簽名(選擇N) 操作步驟(已驗證成功) 步驟1:確認磁盤信息 sudo fdisk -l /dev/mmcblk1 檢查關鍵參數: 總扇區數 :61081566(示例值) 根分區起始扇區 :221184(必須記?。。?步驟2:進入分區工具 sudo fdisk /dev/mmcblk1# 操作SD卡設備 步驟3:刪除相關分區(按順序) Command (m for help): d Partition number (1-5): 5# 先刪后續分區 Command (m for help): d Partition number (1-4): 4# 再刪目標分區 步驟4:重建分區(??關鍵設置) Command (m for help): n Partition number (4-128, default 4): [回車] First sector (34-61081566, default 221184): [回車]# 必須保持默認起始扇區! Last sector: 61081566# 手動輸入磁盤最大扇區值 出現簽名警告時: Partition #4 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N# 選N保留! 步驟5:寫入更改 Command (m for help): w# 保存分區表 The partition table has been altered.# 成功提示 步驟6:在線擴容文件系統 sudo resize2fs /dev/mmcblk1p4# 擴展ext4文件系統 成功輸出: Filesystem at /dev/mmcblk1p4 is now 7607296 (4k) blocks long. 步驟7:驗證結果 sudo df -h 預期輸出: /dev/mmcblk1p429G3.2G 26G 12% /# 大小變為29GiB 注意事項與排錯 起始扇區必須正確 錯誤值會導致系統無法啟動 通過sudo fdisk -l /dev/mmcblk1查看原值 分區簽名必須保留 - Do you remove signature? [Y]# 會導致數據丟失! + Do you remove signature? [N]# 正確選擇 磁盤忙錯誤處理 若提示disk is currently in use sudo umount /dev/mmcblk1p* sudo swapoff -a 操作錯誤恢復 誤刪分區后不要寫入新數據,立即用testdisk恢復: sudo apt install testdisk sudo testdisk /dev/mmcblk1
    發表于 07-09 20:50

    【沁恒CH585開發板免費試用體驗】+手機端控制板上LED燈

    承接上期的呼吸燈效貼,今天來分享一下,將開發板做為BLE從機,手機做為BLE主機,在手機端的藍牙調試助手發送指定字符去控制板上的LED0、LED1。 基于SDK中提供的從機“Peripheral”例程,手機端應用市場安裝好“BLE調試助手”app。編譯“Peripheral”例程后,使用“WCHISPStudio”下載編譯后的“Peripheral.hex”文件。然后打開手機端的藍牙與GPS開關,打開“BLE調試助手”app,掃描連接“Simple Peripheral”設備。連接該設備后則可看到“Generic Access”、“Generic Attribute”、“設備信息”和“Unknown Service”所有服務項。 其中的Unknown Service服務是我們所需著重關注的,該服務是程序中自定義的一個通訊服務,UUID為0xFFE0,點擊該條目,界面顯示出0xFFE0服務下所有的characteristic,其包括“0xFFE1”、“0xFFE2”、“0xFFE3”、“0xFFE4”和“0xFFE5”,并顯示出該服務的Properties。具體如下圖所示: 根據圖示可知,我們可通過“0xFFE1”,““0xFFE3”兩個特征服務給開發進行寫操作,也就是發送字符給開發板解析。然后回到例程中的“Peripheral_Init()”函數。 /********************************************************************* * @fnPeripheral_Init * * @BriefInitialization function for the Peripheral App Task. * This is called during initialization and should contain * any application specific initialization (ie. hardware * initialization/setup, table initialization, power up * notificaiton ... ). * * @paramtask_id - the ID assigned by TMOS.This ID should be *used to send messages and set timers. * * @Returnnone */ void Peripheral_Init() { Peripheral_TaskID = TMOS_ProcessEventRegister(Peripheral_ProcessEvent); // Setup the GAP Peripheral Role Profile { uint8_tinitial_advertising_enable = TRUE; uint16_t desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; uint16_t desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; // Set the GAP Role Parameters GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t), &desired_min_interval); GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t), &desired_max_interval); } { uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; // Set advertising interval GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt); // Enable scan req notify GAP_SetParamValue(TGAP_ADV_SCAN_REQ_NOTIFY, ENABLE); } // Setup the GAP Bond Manager { uint32_t passkey = 0; // passkey \"000000\" uint8_tpairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ; uint8_tmitm = TRUE; uint8_tbonding = TRUE; uint8_tioCap = GAPBOND_IO_CAP_DISPLAY_ONLY; GAPBondMgr_SetParameter(GAPBOND_PERI_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey); GAPBondMgr_SetParameter(GAPBOND_PERI_PAIRING_MODE, sizeof(uint8_t), &pairMode); GAPBondMgr_SetParameter(GAPBOND_PERI_MITM_PROTECTION, sizeof(uint8_t), &mitm); GAPBondMgr_SetParameter(GAPBOND_PERI_IO_CAPABILITIES, sizeof(uint8_t), &ioCap); GAPBondMgr_SetParameter(GAPBOND_PERI_BONDING_ENABLED, sizeof(uint8_t), &bonding); } // Initialize GATT attributes GGS_AddService(GATT_ALL_SERVICES);// GAP GATTServApp_AddService(GATT_ALL_SERVICES);// GATT attributes DevInfo_AddService();// Device Information Service SimpleProfile_AddService(GATT_ALL_SERVICES); // Simple GATT Profile // Set the GAP Characteristics GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName); // Setup the SimpleProfile Characteristic Values { uint8_t charValue1[SIMPLEPROFILE_CHAR1_LEN] = {1}; uint8_t charValue2[SIMPLEPROFILE_CHAR2_LEN] = {2}; uint8_t charValue3[SIMPLEPROFILE_CHAR3_LEN] = {3}; uint8_t charValue4[SIMPLEPROFILE_CHAR4_LEN] = {4}; uint8_t charValue5[SIMPLEPROFILE_CHAR5_LEN] = {1, 2, 3, 4, 5}; SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR1, SIMPLEPROFILE_CHAR1_LEN, charValue1); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR2, SIMPLEPROFILE_CHAR2_LEN, charValue2); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR3, SIMPLEPROFILE_CHAR3_LEN, charValue3); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR4, SIMPLEPROFILE_CHAR4_LEN, charValue4); SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR5, SIMPLEPROFILE_CHAR5_LEN, charValue5); } // Init Connection Item peripheralInitConnItem(&peripheralConnList); // Register callback with SimpleGATTprofile SimpleProfile_RegisterAppCBs(&Peripheral_SimpleProfileCBs); // Register receive scan request callback GAPRole_BroadcasterSetCB(&Broadcaster_BroadcasterCBs); // Setup a delayed profile startup tmos_set_event(Peripheral_TaskID, SBP_START_DEVICE_EVT); } 代碼注釋// Register callback with SimpleGATTprofile,即是初始化注冊的特征值變化回調接口。 // Simple GATT Profile Callbacks static simpleProfileCBs_t Peripheral_SimpleProfileCBs = { simpleProfileChangeCB // Characteristic value change callback }; 然后再根據實驗需求,在“simpleProfileChangeCB()”函數中實現控制板上LED0,LED1的邏輯處理代碼。 /********************************************************************* * @fnsimpleProfileChangeCB * * @briefCallback from SimpleBLEProfile indicating a value change * * @paramparamID - parameter ID of the value that was changed. * pValue - pointer to data that was changed * len - length of data * * @returnnone */ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len) { switch(paramID) { case SIMPLEPROFILE_CHAR1: { uint8_t newValue[SIMPLEPROFILE_CHAR1_LEN]; tmos_memcpy(newValue, pValue, len); if(newValue[0]) { if(newValue[0]== 0x30) { GPIOA_SetBits(GPIO_Pin_0);//關閉LED0 } else if(newValue[0]==0x31) { GPIOA_ResetBits(GPIO_Pin_0); //打開LED0 } else if(newValue[0]==0x32) { GPIOA_SetBits(GPIO_Pin_1);//關閉LED1 } else if(newValue[0]==0x33) { GPIOA_ResetBits(GPIO_Pin_1); //打開LED1 } } PRINT(\"profile ChangeCB CHAR1.. \\\\n\"); break; } case SIMPLEPROFILE_CHAR3: { uint8_t newValue[SIMPLEPROFILE_CHAR3_LEN]; tmos_memcpy(newValue, pValue, len); PRINT(\"profile ChangeCB CHAR3..\\\\n\"); break; } default: // should not reach here! break; } } 實驗在“0xFFE1”服務特征值下進行,因此添加邏輯代碼在“SIMPLEPROFILE_CHAR1”,如果想在“0xFFE3”服務特征值下實驗,則將邏輯代碼添加到“SIMPLEPROFILE_CHAR3”下。 完成上述代碼編寫完后,當然記得在main函數中添加LED0、LED1的GPIO口初始化代碼,默認關閉LED0、LED1。這里筆者LED0使用PA0,LED1使用PA1。main()函數中內容如下: /********************************************************************* * @fnmain * * @brief主函數 * * @returnnone */ int main(void) { #if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE) PWR_DCDCCfg(ENABLE); #endif HSECFG_Capacitance(HSECap_18p); SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz); #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE) GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif #ifdef DEBUG GPIOA_SetBits(GPIO_Pin_14); GPIOPinRemap(ENABLE, RB_PIN_UART0); GPIOA_ModeCfg(GPIO_Pin_14, GPIO_ModeOut_PP_5mA); UART0_DefInit(); #endif PRINT(\"%s\\\\n\", VER_LIB); //LED 0 GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA ); //LED 1 GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA ); GPIOA_SetBits(GPIO_Pin_0); GPIOA_SetBits(GPIO_Pin_1);//默認關閉LED0、LED1 CH58x_BLEInit(); HAL_Init(); GAPRole_PeripheralInit(); Peripheral_Init(); Main_Circulation(); } 開發板的硬件實物連線如下: 工程編譯、下載后,實驗演示正如代碼中一樣。發送數字0或者16進制30則關閉LED0,發送數字1或者16進制31則打開LED0,發送數字2或者16進制32則關閉LED1,發送數字3或者16進制33則打開LED1,效果見底部視頻。
    發表于 07-09 20:42

    【 運算放大器參數解析與LTspice應用仿真 閱讀體驗】+ 第二章放大器參數解析

    請的是數據手冊與分析,低失調和漂移、高精度放大器ADA4077. 這一頁主要是介紹ADA4007的特性。 失調電壓的影響 失調電壓(VOS)是運放輸入端的固有電壓差,即使無輸入信號,也會在輸出端產生直流偏移。 產生的原因 ADA4851-1的輸入失調電壓最大值3.4mV在54.54倍增益下,輸出失調電壓達到185mV,遠超過系統設定的38.7mV故障閾值,是導致電路失效的直接原因。即使典型值0.6mV接近閾值,但芯片個體間的失調電壓分布差異最大值或部分芯片的實際值仍會觸發故障判定。 放大器輸入失調電壓的產生主要源于輸入級對稱晶體管VT1、VT2的晶圓匹配性不足。輸入級通常采用差分對管結構,其性能依賴兩個晶體管的參數一致性。由于晶圓制造過程中材料均勻性、工藝誤差等因素,實際生產的晶體管在電流放大系數、基極-發射極電壓等參數上存在差異,這種不匹配會直接轉化為輸入端的等效電壓差,即輸入失調電壓。 研究表明,晶體管的匹配度在一定范圍內與其占用的晶圓面積平方根成正比。例如,若需將匹配度提升至原來的2倍,晶圓面積需擴大至4倍。但當匹配度達到一定水平后,單純增加面積對改善失調的效果會逐漸飽和,且面積擴大會顯著推高芯片制造成本。因此,通過擴大晶圓面積改善失調的方法存在性能與成本的矛盾。 為平衡性能與成本,工業界常采用兩種策略:一是生產后通過激光調阻、數字 trimming 等測試校準技術,對成品芯片的失調進行補償;二是在電路設計中引入斬波調制、自穩零等技術,動態調整或消除失調電壓。這些方法有效緩解了輸入級不匹配帶來的影響,成為低失調電壓放大器設計的關鍵技術路徑。 失調電壓漂移Offset Voltage Drift是衡量放大器輸入失調電壓隨環境變量變化的關鍵參數,定義為輸入失調電壓變化量與導致該變化的變量變化量的比值。其核心變量包括溫度和工作時間: 溫度漂移:當環境溫度變化時,輸入失調電壓會隨之改變。數據手冊中通常提供溫度范圍內的平均漂移值,單位為μV/℃或mV/℃,符號表示為ΔVos/ΔT或dVos/dT。例如,若溫度升高10℃,失調電壓增加2mV,則溫漂為0.2mV/℃。 時間漂移(長期穩定性):隨工作時間延長,輸入失調電壓可能因材料老化、應力釋放等因素發生緩慢變化,單位為μV/月或mV/年。 總結 ADA4077是一款低失調、低漂移、高精度放大器,其核心性能優勢體現在對失調電壓及其漂移的有效控制。失調電壓源于輸入級對稱晶體管差分對管的晶圓制造不匹配,匹配度與晶圓面積平方根成正比,但過度增加面積會推高成本,因此工業界常通過生產后校準激光調阻、數字trimming或電路設計技術斬波、自穩零來改善。 失調電壓漂移是衡量其隨環境變量溫度、時間變化的關鍵參數:溫度漂移定義為輸入失調電壓變化量與溫度變化量的比值,單位為μV/℃或mV/℃符號ΔVos/ΔT;時間漂移長期穩定性則反映材料老化等因素導致的緩慢變化,單位為μV/月或mV/年。數據手冊通常提供溫度范圍內的平均漂移值。 以ADA4851-1案例為例,其最大失調電壓3.4mV經高增益54.54倍放大后輸出185mV,遠超系統閾值,凸顯低失調設計的重要性。ADA4077通過優化制造工藝提升晶體管匹配性及校準技術,實現更低的失調電壓和漂移,適用于高精度直流信號調理、傳感器接口等對直流誤差敏感的場景。
    發表于 07-09 19:56

    【嘉楠堪智K230開發板試用體驗】開箱測評

    該文章主要介紹一款開發板k230 1,開發板概況 CanMV-K230開發板采用的是嘉楠科技Kendryte?系列AIoT芯片中的最新一代SoC芯片K230。該芯片采用全新的多異構單元加速計算架構,集成了2個RISC-V高能效計算核心,內置新一代KPU(Knowledge Process Unit)智能計算單元,具備多精度AI算力,廣泛支持通用的AI計算框架,部分典型網絡的利用率超過了70%。 該芯片同時具備豐富多樣的外設接口,以及2D、2.5D等多個標量、向量、圖形等專用硬件加速單元,可以對多種圖像、視頻、音頻、AI等多樣化計算任務進行全流程計算加速,具備低延遲、高性能、低功耗、快速啟動、高安全性等多項特性。 該芯片同時具備豐富多樣的外設接口,以及2D、2.5D等多個標量、向量、圖形等專用硬件加速單元,可以對多種圖像、視頻、音頻、AI等多樣化計算任務進行全流程計算加速,具備低延遲、高性能、低功耗、快速啟動、高安全性等多項特性。 2,硬件資源 CanMV?K230 是基于 Canaan Kendryte?K230 AI 邊緣計算芯片的開發板,擁有以下關鍵硬件配置: 雙核 RISC-V 處理器 :包括主頻 1.6?GHz 的 CPU1(支持RVV?1.0 向量擴展)和主頻 800?MHz 的 CPU0 ; KPU 神經網絡加速器 :支持 INT8/INT16 精度,具備 6?TOPS 等價算力; 內存與存儲 :可選 1?GB 或 2?GBLPDDR4;支持最大 512?GB 的 microSD 卡 ; 攝像頭接口 :板載標準 GC2093 攝像頭或可選 OV5647,擁有 3 路 MIPI?CSI(每路兩條或混合)輸入 ; 顯示接口 :支持 MIPI?DSI LCD(最多 1080p)以及 HDMI 輸出(最高 1080p),還能通過 IDE 緩沖區顯示 ; 外設齊全 :包含 2.4?GHz Wi?Fi、USB 2.0 主機、3.5?mm 音頻 I/O、Microphone、GPIO 接口(兼容 Raspberry Pi)、UART/I2C/PWM 等豐富接口。 板子的尺寸約為 85?×?56?×?15?mm,重量約 31?g 。 3,開箱評測 這個板子整體在兼顧小巧輕便的同時,還具備了很多功能,整體采用黑色的pcb外觀,還有散熱片和亞克力保護板,只需要usb-typec口通電便可以驅動板子運行,無需額外的充電器 板載外殼采用 金屬材質 ,結構堅固、觸感沉穩;接口豐富且布局合理,MIPI/HDMI/Type?C/攝像頭模組等端口對位精準;散熱設計合理,搭配金屬底座或散熱片,有效降低運行時溫度提升使用壽命。 頂部是開箱視頻 4,軟件資源 CanMV K230 提供了完整的軟件開發環境,主要包括官方CanMV IDE K230 ,支持 Windows 安裝與鏡像燒錄,集成 REPL 串口交互、文件系統管理、IDE 緩沖區圖像顯示與圖像壓縮上傳功能,過程便捷流暢。IDE 基于 Qt 構建,兼容OpenMV IDE 同步操作,支持 Python 腳本一鍵運行、同時還可以實現斷電自動運行。硬件功能如攝像頭采集、圖像顯示和多媒體加速均在 IDE 中直接調試;串口終端用于實時日志打印、調試反饋及時高效。此外,官方還提供可選SDK(Linux/RT?smart 雙系統)源碼、模型轉換工具與社區示例,再加上 GitHub 資料和論壇支持,助力快速開展機器視覺項目。 下面的就是k230專門的集成開發工具IDEA 同時還配備了如下這些工具 以及k230官方的SDK鏡像,可以通過rufus燒錄到SD卡中,插入k230開發板啟動 此外cannan還配備了k230的指導教程https://wiki.01studio.cc/docs/canmv_k230 這里面配備了很多的基于k230開發板的實驗 5,功能演示 下面演示幾個k230的基礎功能 1, 定時器和led燈閃爍 視頻見底部 2, 文件讀寫 3, 攝像頭 6,總結 總體來看,CanMV K230 作為一款主打 AI 視覺應用的國產開發板,展現出了出色的硬件整合度與實用性。無論是雙核 RISC-V架構、1080P 攝像頭支持,還是專為視覺任務優化的硬件加速模塊,都體現出其針對邊緣 AI 場景的精準定位。配套的軟件資源也較為完善,從 CanMV IDE 到模型部署工具,初學者與進階用戶都能快速上手。板載接口豐富,做工扎實,適合用于智能識別、圖像處理等機器視覺項目的開發。作為入門級 AI 開發平臺,它具備性價比高、易用性強、擴展性好的優點,非常值得一試。
    發表于 07-09 19:34
    主站蜘蛛池模板: 公主岭市| 玛多县| 宿松县| 金湖县| 天柱县| 手游| 汉川市| 长春市| 湘潭县| 永宁县| 眉山市| 巴里| 枝江市| 贡嘎县| 江都市| 通化市| 宁化县| 汝城县| 永仁县| 碌曲县| 都安| 时尚| 阳泉市| 大庆市| 渑池县| 洪湖市| 舞阳县| 徐汇区| 苏州市| 襄垣县| 吉隆县| 合阳县| 乌苏市| 乌鲁木齐县| 高青县| 平邑县| 东至县| 新民市| 宁武县| 博湖县| 盈江县|