一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

看電子技術(shù)的老軟件工程師寫代碼說明

電子森林 ? 來源:硬禾學(xué)堂 ? 作者:硬禾學(xué)堂 ? 2020-12-30 15:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

ZY是一名熱愛電子技術(shù)的老軟件工程師,觀望了兩期Funpack活動(dòng)后,在這一期上了車,功能實(shí)現(xiàn)得好,代碼和說明還寫得清楚明了,很值得學(xué)習(xí)。 以下,enjoy。

自我介紹

本人叫ZY,是一名軟件工程師,從事軟件開發(fā)工作十多年了,本身的工作是與互聯(lián)網(wǎng)相關(guān)的應(yīng)用系統(tǒng)設(shè)計(jì)開發(fā)工作,業(yè)余很喜歡電子技術(shù),所以業(yè)余有空的時(shí)候會(huì)玩一些小的電子制作和開發(fā)的東西,之前有做過一些函數(shù)波形發(fā)生器、迷你示波器,探針等小東西。

實(shí)現(xiàn)功能

本次也是由于拿到板子太晚,也就僅僅基于作業(yè)要求,實(shí)現(xiàn)了簡(jiǎn)單的電阻測(cè)量功能,后續(xù)會(huì)繼續(xù)挖掘更好玩的功能,目前考慮會(huì)做一個(gè)簡(jiǎn)單的示波器,可以通過藍(lán)牙Wi-Fi把數(shù)據(jù)與Thingsboard結(jié)合實(shí)現(xiàn),作業(yè)中使用了16bit的ADC,通過分壓測(cè)試法實(shí)現(xiàn)了電阻測(cè)量功能。軟件部分則是基于瑞薩提供的e2studio工具以及FSP2.1.0軟件包,基于HAL庫調(diào)用了ADC部分的函數(shù)實(shí)現(xiàn)的。軟件部分采用了共計(jì)12次采樣,拋棄前兩次采樣數(shù)據(jù),再去掉最大最小值之后,求平均值的方式實(shí)現(xiàn),同時(shí)計(jì)算采樣數(shù)據(jù)的標(biāo)準(zhǔn)差用于評(píng)估測(cè)試結(jié)果的精準(zhǔn)程度,這樣可以在僅使用一只10K電阻分壓的條件下,更好的提升測(cè)試精度。連接示意圖如下:

e7925db4-4a28-11eb-8b86-12bb97331649.png

測(cè)試方法,按上圖將開發(fā)版與面包板以及其他器件連接好,將開發(fā)板(已下載好程序)的DEBUG USB口與PC端的USB口相連,PC端啟動(dòng)J-Link RTT Viewer,通過RTT Terminal連接開發(fā)版,見下圖

RTT Terminal連接成功后會(huì)打印出操作指引,見下圖

下一步將待測(cè)電阻插入面包板對(duì)應(yīng)的孔位中,在RTT Terminal中輸入測(cè)試指令1,等待約1秒,RTT Terminal中會(huì)輸出電阻測(cè)試結(jié)果(單位歐姆),以及測(cè)試結(jié)果所對(duì)應(yīng)的采樣平均值與樣本集的標(biāo)準(zhǔn)差。見下圖

代碼說明

hal_entry.c 該文件是程序入口,hal_entry函數(shù)中打印了歡迎信息,而后阻塞等待用戶來自RTT Terminal的輸入,用戶輸入后調(diào)用adc_ep.c文件中的read_process_input_from_RTT(void) 函數(shù)進(jìn)行命令處理。 adc_ep.c 該文件是主要的程序文件,以下進(jìn)行簡(jiǎn)要的介紹: staticfloat std_dv(uint16_t samples[], uint8_t count)該函數(shù)是計(jì)算adc樣本向量的標(biāo)準(zhǔn)差,用以評(píng)估樣本向量的采樣置信度; staticint32_t f2i(float ft)該函數(shù)是將浮點(diǎn)數(shù)轉(zhuǎn)換為整數(shù)型,因?yàn)镽TT Print無法輸出浮點(diǎn)數(shù),因此用此函數(shù)將浮點(diǎn)數(shù)的整數(shù)部分與小數(shù)部分分別轉(zhuǎn)換后輸出; staticvoid print_menus(void)該函數(shù)用于輸出菜單項(xiàng); fsp_err_tread_process_input_from_RTT(void)該函數(shù)用于讀取用戶來自RTT Terminal的輸入,調(diào)用點(diǎn)在hal_entry.c的hal_entry()函數(shù)中; staticvoid resistor_estimation(void)該函數(shù)是用于基于adc_ch0的值來估算當(dāng)前待測(cè)電阻的阻值,以下結(jié)合代碼說明;

static void resistor_estimation(void){float r = 0;// adc的參考值非常接近于16bit ADC的測(cè)量范圍的最大值(32767),因此為了不在除法計(jì)算中丟失精度,因此使用乘法計(jì)算這類數(shù)值。 if (adc_ch0 > 32750) { r = 0.32767 * (32767 - adc_ch0);}// 除法計(jì)算對(duì)精度影響不大的情況使用除法計(jì)算。 else { float adcv = adc_ch0; r = (32767 - adcv) / adc_ch0 * 10000; } int32_t int_v = f2i (r); int32_t deci_v = f2i ((r - int_v) * 1000); APP_PRINT("Estimation of resistor at channel 0 is: %d.%d (Ohm) ", int_v, deci_v);}uint16_tuint16_t_cmp(const void *a, const void *b)該函數(shù)用于qsort排序函數(shù); staticfsp_err_t re_sample(void)該函數(shù)用于連續(xù)讀取12次adc的采樣值,丟棄前2次的采樣值,并對(duì)后10次采樣值排序,去掉最大與最小的兩個(gè)值,而后對(duì)另外的8次采樣值求平均值,以及計(jì)算這8次采樣值向量的標(biāo)準(zhǔn)差,以下結(jié)合代碼說明;

static fsp_err_t re_sample(void){ fsp_err_t err = FSP_SUCCESS; // Error status uint16_t single_read = 0;//讀取并丟棄第一次ADC采樣的數(shù)據(jù) err = R_ADC_Read (&g_adc_ctrl, ADC_CHANNEL_0, &single_read); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_Read API on channel 0 failed ** "); return err; }R_BSP_SoftwareDelay (sample_delay, BSP_DELAY_UNITS_MILLISECONDS);//讀取并丟棄第二次ADC采樣的數(shù)據(jù) err = R_ADC_Read (&g_adc_ctrl, ADC_CHANNEL_0, &single_read); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_Read API on channel 0 failed ** "); return err; } R_BSP_SoftwareDelay (sample_delay, BSP_DELAY_UNITS_MILLISECONDS); uint16_t samples[10] = { 0x00 };uint32_t sum_of_adc_reads = 0;//連續(xù)讀取10次ADC采樣數(shù)據(jù) for (uint8_t i = 0; i < 10; i++) { single_read = 0; err = R_ADC_Read (&g_adc_ctrl, ADC_CHANNEL_0, &single_read); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_Read API on channel 0 failed ** "); return err; } if (1 > single_read || 32767 < single_read) { APP_ERR_PRINT("Read bad data on ADC channel 0, operation abort "); return FSP_ERR_ABORTED; } samples[i] = single_read; single_read = 0; R_BSP_SoftwareDelay (sample_delay, BSP_DELAY_UNITS_MILLISECONDS);}//對(duì)10次 ADC采樣的數(shù)據(jù)排序 qsort (samples, 10, sizeof(uint16_t), uint16_t_cmp); uint16_t valid_samples[8] ={ 0x00 };//去除10次采樣數(shù)據(jù)中的最大與最小值,并累加求和 for (uint8_t j = 0; j < 8; j++) { valid_samples[j] = samples[j + 1]; sum_of_adc_reads += samples[j + 1];}//計(jì)算過濾后的8次采樣數(shù)據(jù)的標(biāo)準(zhǔn)差std_deviation = std_dv (valid_samples, 8);//計(jì)算過濾后的8次采樣數(shù)據(jù)的平均值并賦值到adc_ch0變量 adc_ch0 = (uint16_t) (sum_of_adc_reads >> 3); return err;}

staticfsp_err_t adc_ch0_read(void)該函數(shù)用于啟動(dòng)并校準(zhǔn)16bits ADC,而后調(diào)用re_sample函數(shù)讀取的通道0的數(shù)據(jù),以下結(jié)合代碼說明;

static fsp_err_t adc_ch0_read(void){fsp_err_t err = FSP_SUCCESS; // Error status//判斷ADC是否處于被占用的狀態(tài) if (false == adc_busy){ //開啟16 bits ADC模塊 /* Open/Initialize ADC module */ err = R_ADC_Open (&g_adc_ctrl, &g_adc_cfg); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_Open API failed ** "); return err; } // Delay for waiting for ADC be stable R_BSP_SoftwareDelay (5, BSP_DELAY_UNITS_MILLISECONDS); #ifdef BOARD_RA2A1_EK /* Set Reference Voltage Circuit Control register */ R_ADC0->VREFAMPCNT |= ((VREFADCG_VALUE << SHIFT_BY_ONE) | (VREFADCG_ENABLE << SHIFT_BY_THREE)); //根據(jù)芯片手冊(cè)中的建議,16bits ADC使用前需要進(jìn)行校準(zhǔn),這里調(diào)用函數(shù)校準(zhǔn)ADC。 /* Calibrate the ADC */ err = adc_start_calibration (); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** adc_start_calibration function failed ** "); return err; }#endif //調(diào)用HAL庫中的函數(shù),配置ADC,這里配置為連續(xù)讀取模式 /* Configures the ADC scan parameters */ err = R_ADC_ScanCfg (&g_adc_ctrl, &g_adc_channel_cfg); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_ScanCfg API failed ** "); return err; } //啟動(dòng)ADC采樣 /* Start the ADC scan*/ err = R_ADC_ScanStart (&g_adc_ctrl); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_ScanStart API failed ** "); return err; } adc_busy = true; //調(diào)用函數(shù)re_sample()函數(shù)進(jìn)行ADC數(shù)據(jù)采樣,前文有詳細(xì)說明該函數(shù)。 err = re_sample (); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** Sampling on ADC channel 0 failed ** "); return err; } uint8_t counter = 0; //基于調(diào)試結(jié)果分析,低阻值的電阻需要依賴采樣的數(shù)據(jù)的一致性來保證測(cè)量精度,因此這里判斷如果為低阻值數(shù)據(jù),且采樣數(shù)據(jù)標(biāo)準(zhǔn)差大于1.5則進(jìn)行重新采樣處理,共重試最多8次,直至采樣數(shù)據(jù)符合要求,如果超過8次采樣數(shù)據(jù)仍舊未能符合標(biāo)準(zhǔn),則打印測(cè)量失敗的通知到RTT Terminal提示用戶。

if (32755 < adc_ch0 && 1.5f < std_deviation) { APP_PRINT( "Lower resistance value [1(Ohm) ~ 5(Ohm)] found and sampling quality too low, auto perform re-sampling... "); while (1.5f < std_deviation && 10 > counter) { err = re_sample (); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** Sampling on ADC channel 0 failed ** "); return err; } counter++; } } if (32755 < adc_ch0 && 1.5f < std_deviation) { APP_ERR_PRINT("Sampling quality too low, operation abort "); } else { //輸出樣本質(zhì)量評(píng)估的標(biāo)準(zhǔn)差數(shù)據(jù) int32_t int_stddv = f2i (std_deviation); int32_t deci_stddv = f2i ((std_deviation - int_stddv) * 1000); APP_PRINT("Standard deviation of samples is: %d.%d, samples quality is %s ", int_stddv, deci_stddv, std_deviation < 5 ? "GOOD" : "POOR"); //輸出16 bits ADC采樣的原始數(shù)據(jù)。 APP_PRINT("Sampling data at ADC channel 0 is: %d ", adc_ch0); //輸出待測(cè)電阻的估算阻值。 resistor_estimation (); } //停止ADC連續(xù)采樣 err = R_ADC_ScanStop (&g_adc_ctrl); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_ScanStop API failed ** "); return err; } adc_busy = false; //關(guān)閉ADC模塊 err = R_ADC_Close (&g_adc_ctrl); if (FSP_SUCCESS != err) { APP_ERR_PRINT("** R_ADC_Close API failed ** "); return err; } } else { APP_PRINT("Resistor testing in progress "); } return err;}

staticfsp_err_t adc_start_calibration(void)該函數(shù)用于校準(zhǔn)ADC。

活動(dòng)體會(huì)

首先簡(jiǎn)單說一下瑞薩的這塊板子,拿到手的比較晚,大概在12月10號(hào)左右拿到的,所以了解的也十分有限,因?yàn)橐s在20號(hào)前交作業(yè),所以還來不及很充分的去看這個(gè)板子的內(nèi)容。這塊評(píng)估板不論做工還是設(shè)計(jì)都是十分不錯(cuò)的,該有的都有,需要配置和調(diào)整的地方也設(shè)計(jì)的比較靈活,概覽了一下板子的手冊(cè),發(fā)現(xiàn)板子可玩性還是比較強(qiáng)的。 其次再說一下e2studio這款開發(fā)工具,對(duì)于我個(gè)人來說,這個(gè)開發(fā)工具真是太合我心意了。首先我使用eclipse應(yīng)該快有20年了,從上學(xué)到工作中這些年一直也都在使用這個(gè)開發(fā)工具,十分的熟悉,應(yīng)該說瑞薩選擇以eclipse作為基礎(chǔ)來打造開發(fā)環(huán)境,也就是因?yàn)閑clipse在過去的20年中已經(jīng)深入民心了,大部分的工程師尤其是軟件工程師應(yīng)該都有使用eclipse的經(jīng)驗(yàn);另外e2studio針對(duì)調(diào)試和配置兩個(gè)部分做了很好的擴(kuò)展,雖然界面沒有stm32的那么華麗,但是功能簡(jiǎn)潔實(shí)用,軟件的穩(wěn)定程度也很高,在使用過程中還未遇到明顯的錯(cuò)誤。 最后說一下Funpark活動(dòng),這個(gè)活動(dòng)確實(shí)很棒,建立交流群讓共同的愛好者有一個(gè)共同的目標(biāo),一起討論交流,這個(gè)是十分愉快也十分難得的;另外還會(huì)請(qǐng)來高水平老師給大家進(jìn)行培訓(xùn),幫助大家盡量解決問題,掃清了我們完成任務(wù)的障礙;最后是硬禾這個(gè)平臺(tái),在前段時(shí)間板子沒到的時(shí)候,去過硬禾的網(wǎng)站和電子森林的站點(diǎn),里邊的確是包含了非常多的技術(shù)干貨,著實(shí)是能幫助到電子愛好者甚至是專業(yè)從業(yè)人士的。 再次感謝硬禾與Digikey能夠給大家提供這樣一個(gè)好玩又能學(xué)知識(shí)的活動(dòng),實(shí)在是很棒。

原文標(biāo)題:看老工程師寫代碼說明——Funpack第三期分享之二

文章出處:【微信公眾號(hào):FPGA入門到精通】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

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

    關(guān)注

    32

    文章

    1945

    瀏覽量

    91214
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70739

原文標(biāo)題:看老工程師寫代碼說明——Funpack第三期分享之二

文章出處:【微信號(hào):xiaojiaoyafpga,微信公眾號(hào):電子森林】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    電子工程師自學(xué)速成——入門篇

    本文共3冊(cè),由于資料內(nèi)存過大,分開上傳,有需要的朋友可以去主頁搜索下載哦~ 電子工程師自學(xué)速成分為:入門篇、提高篇和設(shè)計(jì)篇,本文為入門篇,內(nèi)容包括電子技術(shù)入門基礎(chǔ)、電子元器件(電阻器
    發(fā)表于 05-15 15:50

    (仰天長嘯)為什么受傷的總是硬件工程師...#MDD#MDD辰達(dá)半導(dǎo)體 #電子工程師

    電子工程師
    MDD辰達(dá)半導(dǎo)體
    發(fā)布于 :2025年04月27日 18:21:47

    工程師經(jīng)驗(yàn)分享:社區(qū)之星 趙云 沉著穩(wěn)定才能做好技術(shù)

    控制算法理論和實(shí)踐有過推導(dǎo)和大量的研發(fā)調(diào)試經(jīng)驗(yàn)。 ? 工作經(jīng)歷: 華為技術(shù)有限公司---芯片驗(yàn)證工程師 上海問問網(wǎng)絡(luò)科技有限公司---電機(jī)驅(qū)動(dòng)軟件工程師 ? ? ? 社區(qū)訪談: 社區(qū)小助手:可以分享一下您的學(xué)習(xí)、工作經(jīng)歷嗎,您是
    的頭像 發(fā)表于 04-15 15:58 ?428次閱讀
    <b class='flag-5'>工程師</b>經(jīng)驗(yàn)分享:社區(qū)之星  趙云 沉著穩(wěn)定才能做好<b class='flag-5'>技術(shù)</b>

    如何成為一名嵌入式軟件工程師

    軟件工程師保持持續(xù)學(xué)習(xí)的態(tài)度,緊跟技術(shù)發(fā)展趨勢(shì);同時(shí),注重實(shí)踐經(jīng)驗(yàn)的積累,積極參與實(shí)際項(xiàng)目的開發(fā)和調(diào)試工作。 此外,還應(yīng)不斷提升自己的溝通能力和團(tuán)隊(duì)協(xié)作能力,以適應(yīng)日益復(fù)雜的工作環(huán)境。 嵌入式
    發(fā)表于 04-15 14:37

    工程師手冊(cè):常用電子物料封裝及參數(shù)介紹

    匯總了工程師常見的電子物料的封裝及參數(shù)介紹,雖然是資料,不過手冊(cè)查看方便 純分享貼,有需要可以直接下載附件獲取資料! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~)
    發(fā)表于 03-28 16:48

    一招拿捏電子工程師#被AI拿捏了 #電子工程師 #電子電工

    電子工程師
    安泰小課堂
    發(fā)布于 :2025年03月25日 17:30:51

    一位電子工程師的十年職場(chǎng)感悟

    這里主要以個(gè)人經(jīng)歷談?wù)?b class='flag-5'>電子工程師技術(shù)生涯可能面臨的困惑、關(guān)心的問題以及對(duì)未來的期待。Chrent新手感興趣的問題1、電子工程師矛盾心態(tài)——
    的頭像 發(fā)表于 03-19 17:32 ?397次閱讀
    一位<b class='flag-5'>老</b><b class='flag-5'>電子</b><b class='flag-5'>工程師</b>的十年職場(chǎng)感悟

    嵌入式軟件工程師就業(yè)好不好?

    嵌入式軟件工程師就業(yè)好不好?會(huì)不會(huì)越越吃香?今天一起來看看。 首先看下市場(chǎng)需求。 隨著物聯(lián)網(wǎng)、人工智能、5G等前沿技術(shù)的快速發(fā)展,嵌入式系統(tǒng)的應(yīng)用領(lǐng)域不斷擴(kuò)大,從智能家居、汽車電子
    發(fā)表于 02-20 10:19

    中國品牌,初心不變,電子工具行業(yè)有感 #原創(chuàng) #MINIWARE #電子愛好者 #電子工程師

    電子工程師
    易迪賽智能科技
    發(fā)布于 :2025年01月20日 17:42:58

    FPGA算法工程師、邏輯工程師、原型驗(yàn)證工程師有什么區(qū)別?

    ,還需要與軟件工程師、硬件工程師緊密合作,對(duì)整個(gè)系統(tǒng)進(jìn)行集成和測(cè)試。 總的來說,F(xiàn)PGA 算法工程師著重于算法優(yōu)化,F(xiàn)PGA 邏輯工程師專注于邏輯設(shè)計(jì),F(xiàn)PGA 原型驗(yàn)證
    發(fā)表于 09-23 18:26

    正是拼的年紀(jì)|65歲電子工程師上班VLOG #65歲退休 #電子工程師 #搞笑 #上班vlog

    電子工程師
    安泰小課堂
    發(fā)布于 :2024年07月25日 11:31:02