ARM单片机

ARM单片机是大多数新手选择的入门切入点,但由于知识的不足,在设计过程中新手们经常会遇到这样或那样的问题,ARM异常中断返回就是这样一种令人头疼的问题。在ARM的使用问题中异常中断返回是新手们较为苦恼的问题,本文就将对ARM异常中断的集中情况进行总结,并给出了一些解决方法。

在正式介绍之前,要为大家补充一些较为重要的基础知识。首先R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;而ADS中的pc,是为了调试看着方便而修改过的,它指向的是正在执行的指令,即“真正pc-8”!

SWI和未定义指令异常中断的返回

指令地址:

A PC-8当前指令为SWI或未定义指令,此时发生中断.PC的值还没有更新。

A+4 PC-4中断时处理器将PC-4保存到LR。;r!

A+8 PC

返回时,从发生中断的指令A(PC-8)的下一条指令A+4(PC-4)处开始执行,所以直接把LR的值赋给PC就行了,具体指令为MOV PC,LR(PC=A+4=LR)。

白话解释:对于SWI和未定义指令发生异常时pc没有更新,根据ARM的三级流水线原理,pc没有更新,仍然等于(A+8);lr = pc – 4(这时处理器决定的,无法更改!)即A+4。

由于这类异常返回后应执行下一条指令(A+4),所以返回时,pc=lr即可。

IRQ 和FIQ异常中断处理的返回指令地址对应于PC A,PC-8执行此指令完成后(!)查询IRQ及FIQ,如果有中断请求则产生中断。

A+4 PC-4

A+8 PC ;lr!

(此时PC的值已经更新,指向A+12.将当前PC-4,即A+8)。

保存到LR.返回时,要接着执行A+4(LR-4)处的指令,所以返回指令为:

SUBS PC,LR,#4(PC=A+4=LR-4)

白话解释:对于普中断和快中断异常,中断必须在一条指令执行完以后被检测到,如正在执行指令甲时发生了中断,不等指令甲执行完是不会处理该中断的,发生异常时pc已经更新(A+12); lr=pc– 4(这时处理器决定的,无法更改!)即A+8返回后,应执行被中断而没有执行的指令(上面的A+4),所以返回时,pc= lr-4。

指令预取中止异常中断处理的返回

指令地址:

A PC-8 执行本指令时发生中断,A+4 PC-4处理器将A+4(PC-4)保存到:

LR. ;lr!A+8 PC

返回时,发生指令预取中止的指令A(PC-8)处重新执行,所以返回指令为SUBS PC,LR,#4(PC=A=LR-4)。

白话解释:对于预取指令中止异常发生预取指令异常时,是在执行时发生的异常,pc未更新,即pc=A+8;lr=pc – 4(这时处理器决定的,无法更改!)即A+4。

由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-4。

数据访问中止异常中断处理的返回

指令地址:

A PC-8 本指令访问有问题的数据,产生中断时,PC的值已经更新。

A+4 PC-4 中断发生时PC=A+12,处理器将A+8(PC-4)保存到LR.。

A+8 PC ;lr!

返回时,要返回到A处继续执行,所以指令为SUBS PC,LR,#8.(PC=A=LR-8)

白话解释:对于数据访问中止异常时,是在执行时访问数据错误。

导致的异常,pc已经更新,即pc=A+12。

lr=pc–4(这时处理器决定的,无法更改!)即A+8。

由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc=lr-8。

总结

引起PC更新的原因一种是数据中止,还有就是中断了。

中断必须是在一条指令执行完毕后才能被检测到,所以它中断的只是还未执行的那条。指令(pc-8),所以pc=lr – 4;

与中断相同,SWI和未定义指令异常也是返回到下一条指令(pc-4),只是他们在执行时,PC的值并没有更新,所以pc= lr。

预取指令中止异常,也没有发生pc更新,但它还得重新执行发生异常的那条指令,所以pc=lr–4。

数据访问中止异常,发生了pc更新,并且它也需要重新执行发生异常的那条指令,所以pc=lr–8。

通过以上的介绍,可以看到造成单片机中断返回的原因非常多,每种方法的应对方案都不尽相同。在ARM芯片调试过程中遇到中断返回问题的朋友不妨仔细阅读本文,相信会从中找到问题的解决方法。

转自: 玩转单片机

围观 10
116

步进电机是一种运用广泛的控制电机,其特征是不使用位置反馈回路就能进行速度控制及定位控制,即所谓的电机开环控制。相对于伺服电机,步进电机有着成本低廉,控制简单等优点,尤其是两相混合式步进电机,在工业运动控制系统中有着广泛的应用。然而,传统的驱动方式,比如单电压驱动、高低电压驱动、斩波恒流驱动等等,虽然已经应用十分成熟,但是只限于低速运行,并且细分度一般限制在1/2步距,无法很好消除低频振荡,以及定位精度差等缺点。细分驱动的出现很好地弥补了这一缺点。

常见的细分控制器一般由MCU、专用逻辑驱动芯片以及功率驱动模块组成,这样的驱动器虽然能满足多细分驱动,但由于细分数量和效果会受到逻辑驱动芯片的影响,并且无法调整细分数和限流值、从而造成系统调试困难、矩频特性差等缺点。

本文使用ST公司的32位,加上MOSFET驱动模块及电流传感模块,省去了逻辑驱动芯片。电机电流采用单片机内部AD采样,控制逻辑算法直接由单片机软件实现,MOSFET按照外部输入的脉冲速度及内部的时序来运行,从而大大简化了应用电路,提高了电路的通用性和驱动性能。

1 意法半导体STM32F103RB单片机简述

STM32F103RB采用ARM公司最新的Cortex-M3内核,具有运行速度高、处理能力强、外设接口丰富等特点。由于其低廉的价格和很强的控制、运算性能,被广泛运用于电机控制。其具体性能指标如下:1)工作频率:最高72 MHz;工作温度范围:-40~+85℃;宽电压供电:2.0~3.6 V;2)128 k字节的闪存存储器和16 k的SRAM;3)12位16通道AD转换器具有双采样和保持功能,转换时间最短1μs。4)3个16位通用定时器,每个定时器有多达4个通道,用于输入捕获/输出比较/PWM或脉冲输出;1个16位带死区控制盒紧急刹车,用于电机控制的PWM高级控制定时器。

2 细分驱动原理

一般两相步进电机驱动分为单极型和双极性驱动两种,单极型驱动适用于6线制电机,这样的驱动方法等于将两相电机转变为四相电机,从表面上看步距角缺损减小了,实则是以牺牲电机的拖动转矩换来的,这样电机的带负载能力就会大大下降。而双极型驱动则主要针对两相四线(或者八线制)电机,一般机械步距角为50齿1.8°(也可为100齿0.9°价格较贵),故细分驱动技术主要是通过对步进电机的相电流进行阶梯化控制,使电机的以更小的单位步距角运行,从而减小步长和低频振荡。

细分驱动的思想是把原来简单的对转子电流的通断过程改变为逐渐的改变各相绕组的电流大小和方向,使电机内部的空间合成磁场逐步改变,这样就能把原来的一个步距角的通电方式改变成为跟随电流的阶梯波,变成多步。具体的计算方法如下:

转矩T在一般情况下可表示为:

T=KT·(-Iasinθ+Ibcosθ) (1)

式子中KT在理想状态下的比例常数,θ为转子的电角度位置。

如果两相步进电机的矩角特性是正弦波,则给绕组通入如下电流:

Ia=Im·cosβ
Ib=Im·sinβ (2)

β为电机希望定位的电角度。

将式(2)代入式(1),则

T=KT·Im·sin(β-θ) (3)

从而可见,两相混合式步进电机的细分就是控制两相绕组中的电流大小。理想状态下,电机内部的磁场为圆形空间旋转磁场,使步进电机按照交流同步电机的方式旋转。而AB相的理想电流为正弦波,而一般情况下通过阶梯波来模拟正弦波,从而达到恒转矩幅值的控制效果。而转矩的大小由合成磁场的矢量来决定,即相邻两个合成磁场的夹角为细分步距角。

每当β变化一度,则步进电机走过1/360的电角度,例如一般的8细分控制,则β的步长为π/16。所以为了实现对两相混合式步进电机的恒转矩细分控制,就需要在电机的两相绕组中通以按正弦规律变化并互差90°相位的的两相电流,阶梯越细小,越接近于正弦波,步距角也越小,细分效果越好。

基于ARM单片机的双相步进电机细分驱动器设计

3 系统硬件设计

基于STM32F103RB驱动系统的硬件部分主要由信号输入端、电源输入端、电源模块、MOSFET驱动模块、H桥模块和采样放大模块组成。总体硬件图如图3所示。

基于ARM单片机的双相步进电机细分驱动器设计

3.1 输入信号

在硬件设计中,需要从外部输入3种信号:Enable使能信号、Dir电机转向信号以及Frequency速度脉冲信号。Enable信号为使能信号,为防止电机在停止时,定子绕组仍然通电造成的电机发热而设置的电机转子断电信号。Dir信号控制电机的转向;而Frequency信号为外部控制器件发出的方波脉冲信号,此信号的频率将决定电机的转速,3个控制信号均由光耦与内部隔离。

驱动器上电前需通过拨码开关设置细分数和限流值,目前细分最多支持16细分,限流值一般为电机绕组可承受的最大电流的1.2倍左右,可以设置6档限流值。驱动器最大可承受4 A的电流。

3.2 系统电源

驱动系统的电源由一个外部输入的24~48V的直流电源输入接线端,然后通过BUCK降压芯片至5 V为内部光耦、比较器和运放供电,然后将5 V通过LDO降至3.3 V给MCU供电,这样MCU能获得相对干净的电源。另一路外部电源经过电阻分压,产生一个15 V电源用于MOSFET驱动芯片IR2010的供电。

3.3 驱动电路

MOSFET驱动部分采用IR公司的IR2101S驱动芯片来驱动双H桥,从而靠双H桥来控制一个四线制步进电机。IR2101是IR公司生产的一款高性价比驱动器,使用方法非常简单,性价比高,能输出100~210 mA电流。IR2101驱动器可驱动一组功率管,整个功率电路需4片即可,这样不但节约制造成本,而且还提高系统稳定性。其驱动电路如图4所示。

基于ARM单片机的双相步进电机细分驱动器设计

3.4 电流检测和过流保护

本系统使用采样电阻来采集经过H桥(即电机的定子电流)。此处采样电阻阻值比较大时,会使电阻分压过大,造成H桥的低端电压高于地电压,影响系统的稳定性,而阻值太小又会使信号过小影响检测精度,所以本系统选用0.1Ω电阻作为采样电阻。然后经过LMV358放大后,成为0~3 V的电压信号,在经过一个跟随器后,进入MCU片上AD,进行数模转换,放大后的信号还连接一个比较器用于过流保护。

4 系统软件设计

系统软件主程序框图如图5和图6所示,图5为主程序软件框图,图6为ADC中断软件流程图。

基于ARM单片机的双相步进电机细分驱动器设计

主程序处于死循环状态,每次外部信号Enable后,就会锁存外部的控制频率,方向,限流值,细分度等信号,然后进行内部参数初始化,等待刷新定时器计时完毕后就开始按照计时中的ADC中断及定时器中断完成的参数计算进行调节位置和速度。

其中ADC在每个PWM的上升沿触发,采样两相电流进行处理,并且将其送给PI调节器调节PWM占空比,并且每次都会与限流值进行比较,一旦电流超过限流值,则自行执行脱机。这些程序在中断中完成,可以是系统更具有实时性。另外,每次走完一个阶梯的波形后,程序将触发timer3计数器,进行细分步数的计算,从而快的调整个周期的细分数。

电机的细分步数为每次Enable之后方能调整,而细分值表则由计算好的正余弦参数存于MCU Flash中。

5 结论

本系统采用电流实时采样并进行PI调节,使两相混合式步进电机的恒转矩运行,真正达到了电流矢量不变控制,在测试中能够有效的降低低频振荡,并且,在16细分的状态下控制工作,大幅度的减小了噪声和阻尼振荡,是一种有效的控制步进电机的手段。

来源: 捷配电子

围观 13
135

由于涉及编程,学习ARM单片机系统对于从事电子电路的设计者来说是有些困难的,学习知识不难,难的是理清其中的开发思路,找到一个好的起点。本文就将从这一步入手,为大家介绍初次接触ARM开发应该从哪几方面来理清开发思路。

做个最小系统板:如果从没有做过ARM的开发,建议一开始不要贪大求全,把所有的应用都做好,因为ARM的启动方式和dsp或单片机有所不同,往往会遇到各种问题,所以建议先布一个仅有Flash、SRAM或SDRAM、CPU、JTAG、和复位信号的小系统板,留出扩展接口。使最小系统能够正常运行,任务就完成了一半,好在ARM的外围接口基本都是标准接口,如果已有这些硬件的布线经验那就更好了。

写启动代码

根据硬件地址先写一个能够启动的小代码,包括以下部分:初始化端口、屏蔽中断、把程序拷贝到SRAM中、完成代码的重映射、配置中断句柄,连接到C语言入口。也许一些示例程序当中bootloader会有很多东西,但是不要被这些复杂的程序所困扰,因为这是设计开发板过程中需要设计,并不包含在ARM设计范畴中。

研究芯片资料

尽管ARM在内核上兼容,但每家芯片都有自己的特色,编写程序时必须考虑这些问题。尤其是女孩子,在这儿千万别有依赖心理,总想拿别人的示例程序修改,却越改越乱。

了解操作系统程序

在ARM的应用开放源代码的程序很多,要想提高自己,就要多看别人的程序,linux,uc/os-II等等这些都是很好的原码。

硬件

如果设计者自己制作硬件,每个厂家基本上都有针对该芯片的DEMO板原理图。如果先将原理图消化。在以后做设计时就能做到对资源的分配心中有数。器件的DATSHEET一定要好好消化。

最小系统板

很多人会问,做最小系统板是2层还是4层好?答:只有AT91可以用两层板,其他的最少4层;44b0的地和电源处理好也可用两层板;谈四层板和33欧电阻:选用四层板不仅是电源和地的问题,高速数字电路对走线的阻抗有要求,二层板不好控制阻抗。33欧电阻一般加在驱动器端,也是起阻抗匹配作用的;布线时要先布数据地址线,和需要保证的高速线;在高频的时候,PCB板上的走线都要看成传输线。

传输线有其特征阻抗,学过传输线理论的都知道,当传输线上某处出现阻抗突变(不匹配)时,信号通过就会发生反射,反射对原信号造成干扰,严重时就会影响电路的正常工作。采用四层板时,通常外层走信号线,中间两层分别为电源和地平面,这样一方面隔离了两个信号层,更重要的是外层的走线与它们所靠近的平面形成称为“微带”(microstrip)的传输线,它的阻抗比较固定,而且可以计算。

对于两层板就比较难以做到这样。这种传输线阻抗主要于走线的宽度、到参考平面的距离、敷铜的厚度以及介电材料的特性有关,有许多现成的公式和程序可供计算。33欧电阻通常串连放在驱动的一端(其实不一定33欧,从几欧到五、六十欧都有,视电路具体情况),其作用是与发送器的输出阻抗串连后与走线的阻抗匹配,使反射回来(假设解收端阻抗没有匹配)的信号不会再次反射回去(吸收掉),这样接收端的信号就不会受到影响。

接收端也可以作匹配,例如采用电阻并联,但在数字系统比较少用,因为比较麻烦,而且很多时候是一发多收,如地址总线,不如源端匹配易做。这里梭说的高频,不一定是时钟频率很高的电路,是不是高频不止看频率,更重要是看信号的上升下降时间。通常可以用上升(或下降)时间估计电路的频率,一般取上升时间倒数的一半,比如如果上升时间是1ns,那么它的倒数是1000MHz,也就是说在设计电路是要按500MHz的频带来考虑。

有时候要故意减慢边缘时间,许多高速IC其驱动器的输出斜率是可调的。Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越嵌入式系统开发中的仿真工具(ICE)的障碍。内核的完全开放使人们可以自己设计和开发出真正的硬实时系统,软实时系统在Linux中也容易得到实现。强大的网络支持使得可以利用Linux的网络协议栈将其开发成为嵌入式的TCP/IP网络协议栈。Linux提供了完成嵌入功能的基本内核和所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。

一个小型的嵌入式Linux系统只需要下面三个基本元素:*引导工具*Linux微内核,由内存管理、进程管理和事务处理构成*初始化进程如果要让它能干点什么且继续保持小型化,还得加上:*硬件驱动程序*提供所需功能的一个或更多应用程序。再增加功能,或许需要这些:*一个文件系统(也许在ROM或RAM)中*TCP/IP网络堆栈。

本文从启动代码、芯片资料、操作系统程序、最小系统版这四个方面来为新手进行讲解,在针对ARM开发思路时首先需要从这四个方面来进行入手,那么在之后的学习过程中就会觉得豁然开朗而不是一头雾水,因此建议各位新手花上几分钟来阅读本文,相信会有意想不到的收获。

转自: 至秦单片机

围观 6
331


ARM单片机是大多数新手选择的入门切入点,但由于知识的不足,在设计过程中新手们经常会遇到这样或那样的问题,ARM异常中断返回就是这样一种令人头疼的问题。在ARM的使用问题中异常中断返回是新手们较为苦恼的问题,本文就将对ARM异常中断的集中情况进行总结,并给出了一些解决方法。

在正式介绍之前,要为大家补充一些较为重要的基础知识。首先R15(PC)总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;而ADS中的pc,是为了调试看着方便而修改过的,它指向的是正在执行的指令,即“真正pc-8”!

SWI和未定义指令异常中断的返回

指令地址:

A PC-8当前指令为SWI或未定义指令,此时发生中断.PC的值还没有更新。

A+4 PC-4中断时处理器将PC-4保存到LR。;r!

A+8 PC

返回时,从发生中断的指令A(PC-8)的下一条指令A+4(PC-4)处开始执行,所以直接把LR的值赋给PC就行了,具体指令为MOV PC,LR(PC=A+4=LR)。

白话解释:对于SWI和未定义指令发生异常时pc没有更新,根据ARM的三级流水线原理,pc没有更新,仍然等于(A+8);lr = pc – 4(这时处理器决定的,无法更改!)即A+4。

由于这类异常返回后应执行下一条指令(A+4),所以返回时,pc=lr即可。

IRQ 和FIQ异常中断处理的返回指令地址对应于PC A,PC-8执行此指令完成后(!)查询IRQ及FIQ,如果有中断请求则产生中断。

A+4 PC-4

A+8 PC ;lr!

(此时PC的值已经更新,指向A+12.将当前PC-4,即A+8)。

保存到LR.返回时,要接着执行A+4(LR-4)处的指令,所以返回指令为:

SUBS PC,LR,#4(PC=A+4=LR-4)

白话解释:对于普中断和快中断异常,中断必须在一条指令执行完以后被检测到,如正在执行指令甲时发生了中断,不等指令甲执行完是不会处理该中断的,发生异常时pc已经更新(A+12); lr=pc– 4(这时处理器决定的,无法更改!)即A+8返回后,应执行被中断而没有执行的指令(上面的A+4),所以返回时,pc= lr-4。

指令预取中止异常中断处理的返回

指令地址:

A PC-8 执行本指令时发生中断,A+4 PC-4处理器将A+4(PC-4)保存到:

LR. ;lr!A+8 PC

返回时,发生指令预取中止的指令A(PC-8)处重新执行,所以返回指令为SUBS PC,LR,#4(PC=A=LR-4)。

白话解释:对于预取指令中止异常发生预取指令异常时,是在执行时发生的异常,pc未更新,即pc=A+8;lr=pc – 4(这时处理器决定的,无法更改!)即A+4。

由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc = lr-4。

数据访问中止异常中断处理的返回

指令地址:

A PC-8 本指令访问有问题的数据,产生中断时,PC的值已经更新。

A+4 PC-4 中断发生时PC=A+12,处理器将A+8(PC-4)保存到LR.。

A+8 PC ;lr!

返回时,要返回到A处继续执行,所以指令为SUBS PC,LR,#8.(PC=A=LR-8)

白话解释:对于数据访问中止异常时,是在执行时访问数据错误。

导致的异常,pc已经更新,即pc=A+12。

lr=pc–4(这时处理器决定的,无法更改!)即A+8。

由于这类异常返回后应重新执行异常的那个指令(A),所以返回时,pc=lr-8。

总结

引起PC更新的原因一种是数据中止,还有就是中断了。

中断必须是在一条指令执行完毕后才能被检测到,所以它中断的只是还未执行的那条。指令(pc-8),所以pc=lr – 4;

与中断相同,SWI和未定义指令异常也是返回到下一条指令(pc-4),只是他们在执行时,PC的值并没有更新,所以pc= lr。

预取指令中止异常,也没有发生pc更新,但它还得重新执行发生异常的那条指令,所以pc=lr–4。

数据访问中止异常,发生了pc更新,并且它也需要重新执行发生异常的那条指令,所以pc=lr–8。

通过以上的介绍,可以看到造成单片机中断返回的原因非常多,每种方法的应对方案都不尽相同。在ARM芯片调试过程中遇到中断返回问题的朋友不妨仔细阅读本文,相信会从中找到问题的解决方法。也可收藏本文以备不时之需,在遇到错误的时候进行查阅。

围观 4
531
订阅 RSS - ARM单片机