当前位置: 首页 > news >正文

ADI的BF561双核DSP怎么做开发,我来说一说(十)驱动直流电机和步进电机

作者的话

ADI的双核DSP,最早的一颗是Blackfin系列的BF561,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。

硬件准备

ADZS-BF561-EZKIT开发板:ADI原厂评估板

AD-ICE20000仿真器:ADI现阶段性能最好的DSP仿真器

产品链接:https://item.taobao.com/item.htm?id=753233120844

软件准备

Visual DSP++5.1.2
CCES2.11.1

硬件环境的搭建

在这里插入图片描述
程序实现的功能

利用 ADSP-BF561 处理器 EBIU(外部总线接口单元)与 CPLD 的无缝连接, 通过对异步 Bank3 的写操作,从而实现直流电机和步进电机的程序控制。

在这里插入图片描述

系统硬件介绍

BF561板采用了两片直流电机芯片 AE2501B,可同时控制 2 个直流电机,也可控制一个 4 相步进电机。CPLD 上做了一个简单的电机控制器,实现了维持电机运转和防止电机芯片烧毁的功能,通过 BF561 的 EBIU 接口可对其控制,CPLD 的 IO 信号通过 74HC245 驱动芯片后控制电机驱动芯片。

步进电机是一种将电脉冲转化为角位移的执行机构。当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的,可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为 100%)的特点,广泛应用于各种开环控制。

系统负载步进电机型号为 25BY4801,单极性,四相 5V 耐压,步进角一般为 7.5 度,相位间电阻为 10 欧姆,工作电流 500mA 的永磁式步进电机;直流电机选用 5V 驱动的小功率直流电机。

在这里插入图片描述

控制时序四相四拍:

正转为:A->C->B->D

反转为:D->BÆCÆA

系统采用集成控制与电机驱动为一体两功能推挽功率放大器 AE2501B,该放大器输入与CMOS 电平兼容,具有抗干扰性,两个输出端,可直接驱动直流电机的正反转,具有较大的驱动能力。每通道可通过 660mA 持续电流,峰值电流可达到 1.15A,同时具有较低的导通压降,内设抗浪涌保护电路,适于感性负载,使之在驱动继电器、直流电机、步进电机或开关功率管时安全可靠。

本系统采用两个 AE2501B 驱动器,组合成四相步进电机驱动电路,同时采用 LVC245做电机信号系统的隔离,通过 LVC245 的使能与否来控制电机驱动电路的启动和禁止。(注在使用时,电动机芯片必须采用外部供电方式。)

CPLD 与 ADSP-BF561 处理器的内部接口参数设置:

在这里插入图片描述

控制寄存器说明如下:
pCtrOut_Flag_A 位定义表(地址 0x2C07000):

在这里插入图片描述

pCtrOut_Flag_OE 位定义表(地址 0x2C050000):

在这里插入图片描述
驱动代码的编写过程要按照以下步骤进行:

第一:向pCtrOut_Flag_OE寄存器写入数据使能驱动器HC245 MOTOR_OE=0。
第二:选择写入地址,向pCtrOut_Flag_A对应的MOTOR_A写入数据1。
第三:延时一段时间,向pCtrOut_Flag_A对应的MOTOR_A写入数据0。
第四:选择写入地址,向pCtrOut_Flag_A对应的MOTOR_B写入数据1。
第五:延时一段时间,向pCtrOut_Flag_A对应的MOTOR_B写入数据0。
第六:选择写入地址,向pCtrOut_Flag_A对应的MOTOR_C写入数据1。
第七:延时一段时间,向pCtrOut_Flag_A对应的MOTOR_C写入数据0。
第八:选择写入地址,向pCtrOut_Flag_A对应的MOTOR_D写入数据1。
第九:延时一段时间,向pCtrOut_Flag_A对应的MOTOR_D写入数据0。

以上为一个四相四拍的一个实现过程。

直流电机控制方法在此不做描述。

核心代码分析

void DC_motor1(int Direction)
{
if(Direction0) // DC_motor1 停止转动
*pCtrOut_Flag_A = 0;
if(Direction
1) // DC_motor1 正转
*pCtrOut_Flag_A = MOTOR_A;
if(Direction==2) // DC_motor1 反转
*pCtrOut_Flag_A = MOTOR_B;
}

void DC_motor2(int Direction)
{
if(Direction0) // DC_motor2 停止转动
*pCtrOut_Flag_A = 0;
if(Direction
1) //DC_motor2 正转
*pCtrOut_Flag_A = MOTOR_C;

if(Direction2) //DC_motor2 反转
*pCtrOut_Flag_A = MOTOR_D;
}
void Step_motor(int Direction)
{
uint8_t test;
if(Direction
0) //步进电机停止转动
*pCtrOut_Flag_A = 0;
if(Direction1) //步进电机正转
{
*pCtrOut_Flag_A = MOTOR_A; //A 相高电平
udelay(DELAY_US); //延时等待电机执行
*pCtrOut_Flag_A = 0; //A 相低电平
*pCtrOut_Flag_A = MOTOR_C; //C 相高电平
udelay(DELAY_US); //延时等待电机执行
*pCtrOut_Flag_A = 0; //C 相低电平
*pCtrOut_Flag_A = MOTOR_B; //B 相高电平
udelay(DELAY_US); //延时等待电机执行
*pCtrOut_Flag_A = 0; //B 相低电平
*pCtrOut_Flag_A = MOTOR_D; //D 相高电平
udelay(DELAY_US); //延时等待电机执行
*pCtrOut_Flag_A = 0; //D 相低电平
}
if(Direction
2) //步进电机反转
{
*pCtrOut_Flag_A = MOTOR_D;
udelay(DELAY_US);
*pCtrOut_Flag_A = 0;
*pCtrOut_Flag_A = MOTOR_B;
udelay(DELAY_US);
*pCtrOut_Flag_A = 0;
*pCtrOut_Flag_A = MOTOR_C;
udelay(DELAY_US);
*pCtrOut_Flag_A = 0;
*pCtrOut_Flag_A = MOTOR_A;
udelay(DELAY_US);
*pCtrOut_Flag_A = 0;
}
}

运行代码后,步进电机会按代码进行步进转动。

http://www.dtcms.com/a/123217.html

相关文章:

  • daz3d ERC Freeze to Morph Target 和 另存为 Morph Asset(s)
  • openstack搭建过程,脚本
  • 卷积神经网络 CNN 系列总结(二)---数据预处理、激活函数、梯度、损失函数、优化方法等
  • HDCP(四)
  • Python Cookbook-5.13 寻找子序列
  • 断言与反射——以golang为例
  • 深入剖析C++单例模式的八种实现演进与工程实践
  • 最新Ktransformers v0.24(Docker)并发部署DeepSeek-V3-0324模型
  • Cygwin编译安装Acise
  • 蓝桥杯省赛(2024)总结一下
  • 健康养生,铺就生命坦途
  • 深入理解 ResponseBodyAdvice 及其应用
  • Vue3+Vite+TypeScript+Element Plus开发-12.动态路由-配置
  • 【在校课堂笔记】Python 第 9 节课 总结
  • MySQL——锁
  • 可道云支持群晖的docker安装了:全网唯一支持onlyoffice安装说明
  • 如何制定合理的项目时间表
  • 本地电脑使用sshuttle命令将网络流量代理到ssh连接的电脑去实现访问受限网络
  • ubunut 20.04 Docker安装简易教学
  • 嵌入式八股---计算机网络篇
  • QT中怎么隐藏或显示最大化、最小化、关闭按钮
  • python爬取1688.item_search_best-查询榜单列表返回数据说明
  • KL散度的三种估计k1 k2 k3
  • 电子生产加工行业数字化转型:破局“多品种小批量”的智造跃迁
  • WinForm真入门(13)——ListBox控件详解
  • 天梯集训+代码打卡笔记整理
  • Apipost自定义函数深度实战:灵活处理参数值秘籍
  • 大模型训练关键两步
  • 物联网卡(NB-IoT/4G)技术详解
  • Flexoo 柔性薄膜加热片技术全解析:从原理到应用优势