优秀的编程知识分享平台

网站首页 > 技术文章 正文

KEIL,KUKA机器人,Cortex-M开发,便携式烙铁技术文章分享

nanyue 2024-07-25 06:07:17 技术文章 15 ℃

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 ...
/* 常用定义 */ bool,NULL,uint8_t,uint16_t,uint32_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知识,重点在此

Tags:

最近发表
标签列表