KEIL,KUKA機器人,Cortex-M開發,便攜式烙鐵技術文章分享

2024年2月6日 24点热度 0人点赞

KEIL 中的 Peripherals 顯示空白?

在線調試的時候下面的菜單可能顯示異常,如下:

可通過修改 Option->Debug 解決:(和仿真那一章節類似)

測試發現使用 DARMSTM.DLL 也是能夠出現相應菜單,但是顯示的結果和實際不符,所以必須改成 TARMSTM.DLL。

那麼為什麼要使用其他的菜單呢,有 SystemViewer 和 Core Peripherals 兩項菜單不就行了?這裡已經包含了所有 CM3 的寄存器,想觀察什麼可以,但是如果你看到增加的菜單之後你就不會這麼想了。

以 GPIO 為例,從增加的菜單觀察寄存器信息是這樣的:

而通過寄存器直接觀察卻是這樣的……

查看原文:
https://www.dianyuan.com/eestar/article-7891.html

KUKA機器人KSS8.6 運動指令高級編程

SPTP/SLIN/SC.End

SPLINE Block/SPL

PTP SPLINE Block/PTP/LIN/C.End

01 SPTP

通常顯示的運動指令如上圖紅色行所示,但是我們打開折合發現下面綠色的指令部分,這才是實際的運動指令和參數設定部分,也就是手冊上所說的聯機表單。

SPTP具體運動指令參數說明如下:

SPTP XP1 WITH 
$VEL_AXIS[1] = SVEL_JOINT(100), 
;指定軸的速度:$VEL_AXIS[1-6] = 0 - 100
$TOOL = STOOL2(FP1), 
;工具設定:$TOOL = $NULLFRAME
$BASE = SBASE(FP1.BASE_NO), 
;基坐標設定:$BASE = $NULLFRAME
$IPO_MODE = SIPO_MODE(FP1.IPO_FRAME), 
;外部TCP設定:$IPO_MODE = #BASE / #TCP
$LOAD = SLOAD(FP1.TOOL_NO), 
;負載設定:$LOAD = LODA_DATA[0]
$ACC_AXIS[1] = SACC_JOINT(PPDAT1), 
;指定軸的加速度:$ACC_AXIS[1-6] = 0 - 100
$APO = SAPO_PTP(PPDAT1), 
;軌跡逼近:$APO.CDIS = 0 - 1000
$GEAR_JERK[1] = SGEAR_JERK(PPDAT1), 
;指定軸的加加速度 $GEAR_JERK[1-6] = 0 - 100
$COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(1) 
C_Spl 
;軌跡逼近(前面有空格)
SPTP以上的指令可以這樣寫:
;定義位置點變量
DECL E6POS XPTEST
;位置點初始化
XPTEST={X 1753.15979,Y -229.291122,Z 856.999878,A -180.000,B 5.46853300E-08,C 180.000}
;SPTP 運動指令
SPTP  XPTEST WITH 
$VEL_AXIS[1] = 100, 
$TOOL = $NULLFRAME, 
$BASE = $NULLFRAME, 
$IPO_MODE = #BASE, 
$LOAD = LOAD_DATA[1], 
$ACC_AXIS[1] = 100, 
$APO.CDIS = 10, 
$GEAR_JERK[1] = 100 C_Spl

……

查看原文:
https://www.dianyuan.com/eestar/article-7903.html

從文件角度看Cortex-M開發(1) - 源文件

眾所周知,嵌入式開發屬於偏底層的開發,主要編程語言是C和匯編。所以本文要講的source文件主要指的就是c文件和匯編文件。

盡管在平常開發中,我們都隻會關註自己創建的.c/.h/.s源文件,但實際上我們不知不覺中也跟很多不是我們創建的源文件在打交道,那麼問題來了,一個完整的嵌入式工程(以基於ARM Cortex-M控制器的工程為例)到底會包含哪些source文件呢?

現在就到了痞子衡的show time了,痞子衡將這些文件按來源分為五類十種,下面痞子衡按類別逐一分析這些文件:

第一類:Provided by Committee

第一類文件由C標準委員會提供,該類文件伴隨著標準的發佈而逐漸壯大。該類文件主要就是一種,即C標準庫。

1. C standard Library  

大傢都知道C語言是有標準的,常見的C標準有ANSI C(C89)、C99、C11,而C標準函數庫(C Standard library)就是所有符合C標準的頭文件的集合,以及常用的函數庫實現程序。C標準庫由Committee制訂發佈,通常會被包含在IDE裡。列舉一些常見文件和函數如下,是不是覺得似曾相識?

/* 常用文件 */ assert.h,stdio.h,stddef.h,stdint.h,string.h ...
/* 常用定義 */ boolNULLuint8_tuint16_tuint32_t...
/* 常用函數 */ assert(),printf(),memset(),memcpy()...

第二類:Provided by IDE(Compiler)

第二類文件由IDE提供,C語言是編譯型語言,需要編譯器將C程序匯編成機器碼,所有便有了一些跟編譯器特性相關的函數庫。

2. Compiler Library  

我們在開發嵌入式應用時需要借助集成開發環境(IDE),常見的IDE有GCC(GNUC),Keil MDK(ARMCC),IAR EWARM(ICCARM),這些IDE都有配套的C編譯器,這些編譯器是各有特色的,為了充分展示各編譯器特色,配套的函數庫便應運而生。

編譯器函數庫是因IDE而異的,此處僅講一個例子以供參考,需要了解更多需查看各IDE手冊。

以IAR EWARM裡的DLib_Product_string.h文件為例,該文件中重定義了memcpy的實現:

#define _DLIB_STRING_SKIP_INLINE_MEMCPY
#pragma inline=forced_no_body
__EFF_NENR1NW2R1 __ATTRIBUTES void * memcpy(void * _D, const void * _S, size_t _N)
{
  __aeabi_memcpy(_D, _S, _N);
  return _D;
}

第三類:Provided by ARM

第三類文件由ARM提供,嵌入式程序的執行靠的是控制器內核(此處指的內核便是ARM內核),ARM公司在設計內核時,提供了一些內核模塊的接口,開發者可以通過這些接口訪問內核資源,CMSIS header裡就是這些內核模塊資源的接口。

3. CMSIS header  

完整的CMSIS header目錄應該是下面這個樣子,而必須要關註的隻有\CMSIS\Include下面的core_cmx.h文件……

原文鏈接:
https://www.dianyuan.com/eestar/article-7941.html

從文件角度看Cortex-M開發(2) - 鏈接文件

在前一節課《源文件(.c/.h/.s)》裡,痞子衡給大傢系統地介紹了source文件,source文件是嵌入式工程裡典型的input文件,那麼還有沒有其他類型的input文件?既然痞子衡這麼提問了,那答案肯定是有啦。今天痞子衡要講的linker文件就屬於另一種input文件。

linker文件顧名思義就是嵌入式工程在鏈接階段所要用到的文件,source文件在編譯過程完成之後(此時已經是機器可識別的二進制機器碼數據),需要再經過鏈接器從而將二進制數據有序組織起來形成最終的二進制可執行文件,該二進制文件最終會被下載進芯片內部非易失性存儲器裡。linker文件就是用來指示鏈接器如何組織編譯生成的二進制數據。

linker文件是跟IDE息息相關的,本文以IAR EWARM為例介紹linker文件,其他IDE下的linker文件可觸類旁通。

一、 嵌入式系統中的section

在講linker文件之前,痞子衡必須先跟大傢理清一個嵌入式系統中很重要的概念-section。那麼什麼是section?我們寫的C或者匯編source文件裡都是各種應用代碼,這些代碼按功能可以分為很多種類,比如常量、變量、函數、堆棧等,而相同類型的代碼的集合便是一個section,鏈接器在鏈接時組織數據的基本單元便是section。那麼一個典型的嵌入式系統中到底有多少種section呢?下面列出了IAR裡默認的所有section,那些常見section在後續介紹linker文件裡會被提到。

//常見Section
.bss                 // Holds zero-initialized static and global variables.
CSTACK               // Holds the stack used by C or C   programs.
.data                // Holds static and global initialized variables.
.data_init           // Holds initial values for .data sections when the linker directive initialize is used.
HEAP                 // Holds the heap used for dynamically allocated data.
.intvec              // Holds the reset vector table
.noinit              // Holds __no_init static and global variables.
.rodata              // Holds constant data.
.text                // Holds the program code.
.textrw              // Holds __ramfunc declared program code.
.textrw_init         // Holds initializers for the .textrw declared section.
//較冷僻Section
.exc.text            // Holds exception-related code.
__iar_tls.$$DATA     // Holds initial values for TLS variables.
.iar.dynexit         // Holds the atexit table.
.init_array          // Holds a table of dynamic initialization functions.
IRQ_STACK            // Holds the stack for interrupt requests, IRQ, and exceptions.
.preinit_array       // Holds a table of dynamic initialization functions.
.prepreinit_array    // Holds a table of dynamic initialization functions.
Veneer$$CMSE         // Holds secure gateway veneers.
//更冷僻Section
.debug               // Contains debug information in the DWARF format
.iar.debug           // Contains supplemental debug information in an IAR format
.comment             // Contains the tools and command lines used for building the file
.rel or .rela        // Contains ELF relocation information
.symtab              // Contains the symbol table for a file
.strtab              // Contains the names of the symbol in the symbol table
.shstrtab            // Contains the names of the sections.

Note:上述section的詳細解釋請查閱IAR軟件安裝目錄下

\IAR Systems\Embedded Workbench xxx\arm\doc\
EWARM_DevelopmentGuide.ENU.pdf文檔裡的Section reference一節。

二、解析linker文件

知道了section概念,那便可開始深入了解linker文件,什麼是linker文件?linker文件是按IDE規定的語法寫成的用於指示鏈接器分配各section在嵌入式系統存儲器中存放位置的文件。大傢都知道嵌入式系統存儲器主要分為兩類:ROM(非易失性),RAM(易失性),所以相應的這些section根據存放的存儲器位置不同也分為兩類屬性:readonly, readwrite。實際上linker文件的工作就是將readonly section放進ROM,readwrite section放進RAM……

查看原文:
https://www.dianyuan.com/eestar/article-7940.html

便攜式烙鐵兩種MOS管控制加熱電路對比

前兩天分析了一個正點原子的拆解,和一個立創上的便攜式電烙鐵的分析,今天主要是對他們的烙鐵加熱部分的電路進行對比。

首先是立創上的電路,如下:

是使用一個NMOS(一定要註意Vds耐壓要大於Vbus)去控制PMOS,VBUS是誘騙出來的電壓。

當HEAT為高電平時,PMOS導通,當HEAT為低電平時,PMOS截止。這種驅動方式會相對推挽驅動來說慢一些,因為對Cgs的充放電速度會被R8和R9的大小所限制,而這會影響到PMOS的導通速度,從而影響MCU控制的速度。

然後看正點原子的硬件拆解圖(如上圖),用了一個NMOS,一個PNP,一個NPN,一個PMOS。雖然沒有實物圖,但是也大致畫了一下原理圖,是一個推挽結構,大致如下:

EN為高電平時,Q1導通,然後三極管基極電壓約等於0V,然後三極管Q2截止,三極管Q3導通,通過紅色路徑給Q4的Cgs充電,當Vgs>Vgs(th)時Q4的PMOS導通,給電烙鐵加熱。由於是通過三極管進行充電,所以這個PMOS的導通速度是很快的

EN為低電平時,Q1截止,然後三極管基極電壓約等於VCC_PD,然後三極管Q2導通,三極管Q3截止,通過紅色路徑給Q4的Cgs放電,當Vgs<Vgs(th)時Q4的PMOS截止,電烙鐵停止加熱。由於是通過三極管進行放電,所以這個PMOS的截止的速度也是很快的……

查看原文:
https://www.dianyuan.com/eestar/article-7951.html

一階反相帶通濾波器仿真與計算

今天群友在群裡問了一張電路圖,大致如下,問這個圖怎麼看:

這是一個非常典型的一階反相輸入的帶通濾波器,近似由R1和C1組成的高通濾波器R2和C2組成的低通濾波器組合而成,同相輸入端那邊的1.5V是提供一個直流偏置(因為是單電源供電,不提供直流偏置會反相削波),打開multisim的交流仿真,對這個電路圖的仿真結果如下:

其通帶最大增益為7.3979db,上限截止頻率為15.23HZ,下限截止頻率為691.76HZ,然後我們計算一下,fl為下限截止頻率,fh為上限截止頻率近似為:

fl=1/(2*pi*R1*C1)=15.92HZ

fh=1/(2*pi*R2*C2)=663.15HZ

在通帶內的增益近似為:

A = -R2/R1 = 7.604db……

查看原文:
https://www.dianyuan.com/eestar/article-7952.html

更多精彩內容,盡在電子星球 APP(https://www.eestar.com/)

六篇技術文章,讓你秒懂電容的脾氣秉性

七篇DIY技術文章獻給你,讓你腦洞全開

五篇文章幫你開啟DSP的學習思路

匯總篇:關於PID知識,重點在此