3.1 交流电机的模拟参数输入硬件电路
模数转换模块(ADC)有两种不同的工作方式:连续自动排序模式、启动/停止模式。
1. ADC控制寄存器1(ADCTRL1)
2. ADC控制寄存器2(ADCTRL2)
3. 最大转换通道寄存器(MAXCONV)
4. 自动排序状态寄存器(AUTO_SEQ_SR)
5. ADC输入通道选择排序控制寄存器(CHSEL SEQn)
6. ADC转换结果缓冲寄存器(RESULTn)
此例中用事件管理器A的定时器2定时时间到来触发A/D采样的启动。采样时采用级连模式,一次做16个转换,转换通道分别是0~15。转换完成后,在A/D中断服务子程序中将转换结果读出。该程序只作一次A/D采样。
7. 所需的复位和中断向量定义文件“vectors.asm”
// 该文件利用汇编语言代码定义了复位和中断向量
.title “vectors.asm”
.ref _c_int0,_nothing,_ADINT
.sect “.vectors”"
reset: b _c_int0 // 复位向量
int1: b _ADINT // A/D中断向量
int2: b _nothing
int3: b _nothing
int4: b _nothing
int5: b _nothing
int6: b _nothing
8. 主程序Adc.c
// 该程序用于进行A/D转换,A/D转换的结果保存在DRESULT[16]中,寄
// 存器ceshi用于测试每个A/D转换的结果
#include "register.h"
int ADRESULT[16]; // 定义一个数组用于保存AD转换的结果
volatile unsigned int *j; // 定义一个指针变量
int i=0x00,ceshi;
// 屏蔽中断子程序
void inline disable()
{
asm(" setc INTM");
}
// 开总中断子程序
void inline enable()
{
asm(" clrc INTM");
}
// 系统初始化子程序
void initial()
{
asm(" setc SXM"); // 符号位扩展有效
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x81FE; // CLKIN=6M Hz,CLKOUT=4*CLKIN=24M Hz
*WDCR=0x0E8; // 不使能看门狗
*IMR=0x0001; // 允许INT1中断
*IFR=0x0FFFF; // 清除全部中断标志,“写1清0”"
}
// AD初始化子程序
void adinit ()
{
*T2CNT=0x0000; // T2计数器清0
*T2CON=0x170C; //T2为连续增计数模式,128分频,选用内部时钟源
*T2PER=0x75; // 设置T2的周期寄存器
*GPTCONA=0x400; // T2周期中断标志触发AD转换
*EVAIFRB=0x0FFFF; // 清除EVA中断标志,“写1清0”
*ADCTRL1=0x10; // 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
// 转换时间预定标位CPS为0,AD为启动/停止模式,
// 排序器为级连工作方式
*ADCTRL2=0x0504; // EVA的一个事件信号触发AD转换,用中断模式1
*MAXCONV=0x0F; // 16通道
*CHSELSEQ1=0x3210;
*CHSELSEQ2=0x7654;
*CHSELSEQ3=0x0BA98;
*CHSELSEQ4=0x0FEDC; // 转换通道是0~15
}
// 启动AD转换子程序(通过启动定时器4的方式间接启动)
void ADSOC()
{
*T2CON=*T2CON|0x40; // 启动定时器2
}
// 若是其它中断则直接返回子程序
void interrupt nothing()
{
return;
}
// AD中断服务子程序
void interrupt ADINT()
{
asm(“ clrc SXM”); // 抑制符号位扩展
j=RESULT0; // 取得RESULT0的地址
for(i=0;i<=15;i++,j++)
{
ADRESULT[i]=*j>>6; // 把AD转换的结果左移6位后存入规定的数组
ceshi=ADRESULT[i]; // 检验每个A/D转换的结果
}
*ADCTRL2=*ADCTRL2|0x4200;// 复位SEQ1,且清除INT FLAG SEQ1。
enable(); // 开总中断,因一进入中断总中断就自动关闭了
}
main()
{
disable( ); // 禁止总中断
initial( ); // 系统初始化
adinit ( ); // AD初始化子程序
enable( ); // 开总中断
ADSOC( ); // 启动AD转换
while(1)
{
if(i==0x10) break;
//如果已发生中断,则停止等待(发生中断后,i=0x10)
}
*T2CON=*T2CON&0x0FFBF; // 停止定时器2,即间接停止A/D转换
while(1)
{
;
} // 死循环,在实际的工程应用中在此可以利用A/D转换的结果
}
1. 立即数寻址
2. 直接寻址
3. 间接寻址
1. ABS,累加器取绝对值
2. ADD,累加器加
3. ADDC,带进位的累加器加
4. ADDS,符号扩展抑制的累加器加
5. ADRK,辅助寄存器加短立即数
6. AND,和累加器进行与操作
7. B,无条件跳转
8. BACC,跳转到累加器指定的地址
9. BANZ,辅助寄存器非0跳转
10. BCND,条件跳转
11. CALA,累加器指定地址的子程序调用
12. CALL,无条件子程序调用
13. CC,条件子程序调用
14. CLRC,控制位清零
15. CMPL,累加器逻辑取反
16. CMPR,辅助寄存器与AR0比较
17. IN,从端口读入数据
18. INTR,软件中断
19. LACC,带移位的累加器装载
20. LACL,装载累加器低16位,高16位清0
21. LAR,辅助寄存器装载
22. LDP,数据页指针装载
23. LT,暂存寄存器装载
24. LST,状态寄存器装载
25. LTD,TREG寄存器装载、累加前一次乘积并数据移动
26. MAR,修改辅助寄存器
27. MPY,乘
28. MPYU,乘无符号数
29. NEG
30. NMI,非屏蔽中断
31. NOP,空操作
32. OR,与累加器进行或操作
33. OUT,输出数据到端口
34. PAC,乘积寄存器内容装载到累加器
35. POP,堆栈顶内容弹出到累加器低16位
36. PUSH,累加器低16位压入堆栈
37. RET,子程序返回
38. RPT,重复执行下一条指令
39. SACH,存储累加器移位后的高16位
40. SACL,存储累加器移位后的低16位
41. SAR,存储辅助寄存器
42. SBRK,辅助寄存器减去短立即数
43. SETC,控制位置位
44. SPAC,累加器减乘积寄存器
45. SPH,存储乘积寄存器的高16位
46. SPLK,长立即数存储到数据存储单元
47. SPM,将立即数赋给乘积移位模式PM位
48. SST,存储状态寄存器
49. SUB,累加器减
1. 所需的复位和中断向量定义文件“vectors. asm”
// 该文件利用汇编语言代码定义了复位和中断向量
.title “vectors .asm” ;此文件名为vectors .asm
.sect “.vectors” ;定义主向量段
reset: b _c_int0 ;复位向量
int1: b GISR1 ;中断优先级1,ADC中断属于INT1
int2: b PHANTOM
int3: b PHANTOM
int4: b PHANTOM
int5: b PHANTOM
int6: b PHANTOM
reserved b PHANTOM
sw_int8 b PHANTOM
…
sw_int31 b PHANTOM
.sect “.pvecs” ;定义子向量段
PVECTORS b PHANTOM ;保留向量地址偏移量0000H
b PHANTOM ;保留向量地址偏移量0001H
b PHANTOM ;保留向量地址偏移量0002H
b PHANTOM ;保留向量地址偏移量0003H
b ADCINT_ISR ;向量地址偏移量0004H为ADC中断
b PHANTOM ;保留向量地址偏移量0005H
…
b PHANTOM ;保留向量地址偏移量00041H
2. 主程序Dyxhcj.asm
;主程序:
.include "register.h" ;引用头部文件
st0_temp .usect “.b20”,1 ;分配1个字的空间给st0_temp
st1_temp .usect “.b20”,1 ;分配1个字的空间给st1_temp
context .usect “.b20”,7 ;分配7个字的空间给context
STACK .usect “.stack”, 40 ;分配40个字的空间给STACK
ADRESULT .usect “.data0”,8 ;分配8个字的空间给ADRESULT
.def _c_int0 ;定义标号_c_int0
.text ;下列指令为可执行代码
_c_int0
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH, SCSR1 ;CLKIN=6M Hz,CLKOUT=4*CLKIN=24M Hz
SPLK #0E8H, WDCR ;关看门狗
LDP #0
SPLK #0001H,IMR ;允许INT1 中断
SPLK #0FFFFH,IFR ;清除所有中断标志
CALL ADINIT ;初始化ADC 程序
CLRC INTM ;开全局中断
CALL AD ;启动模数转换程序
WAIT: NOP
B WAIT
; ADC 初始化程序
ADINIT:
LDP #232 ;设置通用定时器2
SPLK #0000H, T2CNT ;计数器清0
SPLK #170CH, T2CON ;连续增计数模式,输入时钟=CPU时钟/128
SPLK #075H, T2PR ;定时器周期中断时间
SPLK #0400H, GPTCONA ;由定时器2的周期中断启动模数转换
SPLK #0FFFFH, EVAIFRB
SPLK #0000H, EVAIMRB ;屏蔽定时器2的周期中断,但不影响
;定时器2定时周期到时相应的中断标
;志位置1,从而启动模数转换。
LDP #DP_PF2 ;设置ADC 控制寄存器
SPLK #0000H, ADCCTRL1 ;双排序器工作模式,启动/停止模式,CPS=0
;ADC中断请求为高优先级
SPLK #0400H, ADCCTRL2 ;SEQ1采用中断模式1,不使能SEQ2中断
SPLK #0007H, MAXCONV ;8个通道的转换
SPLK #0000H, CHSELSEQ1
SPLK #0000H, CHSELSEQ2
RET
;启动模数转换程序
AD:
LDP #DP_PF2
LACL ADCCTRL2
OR #2000H ;EVA事件触发启动SEQ1
SACL ADCCTRL2
LDP #232
LACL T2CON
OR #40H ;启动定时器2
SACL T2CON
RET
;中断程序
GISR1: ;INT1 中断子程序入口
;保护现场
LDP #0 ;保存上下文
SST #0, st0_temp ;保存ST0的内容到st0_temp
SST #1, st1_temp ;保存ST1的内容到st1_temp
SACL context ;保存ACC 的低16 位,context=(AL)
SACH context+1 ;保存ACC 的高16 位,context+1=(AH)
SAR AR1, context+2 ;context+2=(AR1)
SAR AR2, context+3 ;context+3=(AR2)
SAR AR3, context+4 ;context+4=(AR3)
SAR AR4, context+5 ;context+5=(AR4)
SAR AR5, context+6 ;context+6=(AR5)
LDP #0E0H ;DP=E0H,页首地址为7000H(E0H*80H)
LACC PIVR,1 ; PIVR的内容左移一位后送入ACC
ADD #PVECTORS ;加上外设中断入口地址
BACC ;跳到相应的中断服务子程序
ADCINT_ISR:
CLRC SXM ;抑制符号扩展
LDP #DP_SARAM2
LAR AR0, #8 ;(AR0) =8
LAR AR1, #ADRESULT ;(AR1) = ADRESULT
LAR AR2, #RESULT0;(AR2)= RESULT0,转换结果存储在位15~位6
MAR *, AR2
ADC1: ;得到8个转换结果,依次存放在地址为(AR1)+2*n的存储器区间
LACC *+, 10, AR1;(ACC)=((AR2))<<10,(AR2)= (AR2)+1
SACH * ;((AR1))= (AH)=右对齐的转换结果
ADRK #2 ;(AR1) = (AR1)+2
MAR *, AR0
BANZ ADC1,*-, AR2
;若(AR0)≠0,则跳转到ADC1;(AR0) = (AR0)-1
LDP #DP_PF2 ;一次转换结束,8个通道的转换结果全部读出
LACL ADCCTRL2 ;(ACC)= (ADCCTRL2) = (0000 0400H)
OR #4000H ;复位 SEQ1
AND #0FFDFH ;清 INT FLAG SEQ1
LACL T2CON
AND #0FFBFH ;停止定时器2,即停止A/D 转换
SACL T2CON
GISR1_RET: ;中断返回出口
LDP #DP_EVA
SPLK #0FFFFH, EVAIFRA
LDP #0
LAR AR5, context+6
LAR AR4, context+5
LAR AR3, context+4
LAR AR2, context+3
LAR AR1, context+2
LACC context+1, 16
ADDS context
LST #1, st1_temp
LST #0, st0_temp
;恢复现场
CLRC INTM ;开总中断,因为一进中断就自动关闭了总中断
RET
;假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
1. 程序执行过程
2. 采样过程说明
3. 数字量与模拟量的关系
(3.1)
4. ADCINT中断向量地址的获取
5. A/D转换的转换周期
A/D转换的转换周期可被分成5个阶段:
1 启动时序同步(SOS同步)。
2 采样时间(ACQ)。
3 转换时间(CONV)。
4 结束转换时间(EOC)。
5 序列转换完成后设置标志位时间(EOS)。
此设计中A/D转换的转换周期=2+16+80+8+1=107个CLKOUT时钟周期。
6. 定时器2的定时周期中断时间T
定时器在连续增计数模式下,定时器周期的时间为TxPR+1个定标的时钟输入周期,此设计中,,T=(117+1)*128/CPU时钟频率=118*128个CLKOUT时钟周期。
作业
3.2简述模数转换模块(ADC)的工作原理。
3.3简述模数转换模块(ADC)的两种工作方式的特点。
3.5 简述TMS320LF2407A实现交流电机转速测量的过程。
¥29.8
¥9.9
¥59.8