发球机的制作

来源:互联网 发布:tiny core linux 7.1 编辑:程序博客网 时间:2024/05/16 18:15

发球机项目总结

项目的共能实现:1.能够实现控制5个电机的调速功能

                2.能够在迪文dgus屏幕上显示

                3.能够实现掉电存储的模式

                4.具有闭环反馈的功能

 

一、    实现过程

(1)   首先要解决的是直流电机的闭环反馈的难题。

<1>:首先选择了一款驱动器,成都爱控电子科技的AQMD3630.此控制器带有闭环反馈的功能。采用的硬件的链接方法如下图

<2>:由于考虑到成本要替换掉测速发电机,采用的是霍尔传感器。下面是霍尔传感器的描述

使用的是三线制的PNP型霍尔传感器,24V供电。(工作电压的范围是 6-36V大约的),属于常闭。

红(棕)接正,蓝接负,(黄)黑色信号。当接通时,输出信号为24V

<3>:使用霍尔开关代替测速发电机的思路是,通过霍尔开关测量出不同的转速,通过单片机转换成相应的电压。把电压0-5v送给直流驱动器。

   软件的解决方法:

1.  首先使用到定时器,配置定时器7,记录出没记录一周的计数,通过设置的时钟,计算出没计数一个所用的时间,这样就可以计算出,不同的转读转动一周所用的时间了。

2.  上述所得出的是r/s,*60后得出每分钟的转速。

3.  这样就实现了测量的转速。

4.  由于设定的计数值是1000;二转速的最大值有2700左右,所以2700/2.7=1000;对应的是pwm的最大,输出的电压时4.7V。这样就实现了闭环反馈的部分。

(2)   下面就是要实现通信来控制转速了,由于爱控的驱动器支持485通信,而且支持的是modbus协议,所以下一步使用485通信来实现控制转速。

<1>首先使用驱动器本身的上位机软件,获取调速的指令

地址 +0x06 0x00 0x40 0x数据 0x数据 0xCRC校验

地址是选择驱动器的地址,可以通过拨码开关来进行设置。

例如 0x02 0x06 0x00 0x40 0x00 0x64 0xCRC校验

就是控制02的电机,调试时100(十进制)。

<2>接下来使用串口助手来进行调试,发送指令后是否会进行调速,如果按照串口助手最初的设置是进行不了调速的,方法是要设置成偶校验,波特率是9600才可也。

<3>接下来就是使用单片机来进行调速。

 首先就要使用串口发送上述的一条字符串。参考代码如下

在发送的时候出现了几个问题;

数据的发送不准,那是因为奇偶校验的时候,没有配置对。改过后可以了,

其次就是每次发送在开始都会发送一个字符,原因是硬件的问题,不是软件的问题,每次重启后每次发送条数据。即可

<3>串口程序写好后就可以使用单片机控制调速了。每次发送不同的数,会有不同的转速。(0-500是调速的范围)

<4>一个的调速电机写好后,其他的三个电机调速方法只是需要改变地址即可。

所有驱动器的 485 的信号线A、B分别并联后与 485 主机 485 的信号线A、B连接。并连的每一个驱动器的设定的地址应唯一,不能与其它驱动器相同,如下图

 

接下来解要使用迪文的Dgus屏触控调速了。

(3)   首先要会使用Dgus的上位机软件。下图是使用界面4.9版本

    

5.3版本内容更丰富些,更好用些。但是作者只是用了4.9的。

<1>这里有变量图标,文本,按键返回等,他们的特点就是都有一个地址,这是单片机处理额重要依据,其实和单片的操作也很相似,每个数据都有个地址,先要改变数值,只要到设定的地址处,改变大小即可。

<2>:迪文默认的115200波特率对应的是A5 5A,这个是可以修改的。我们按照默认值。使用Dgus软件要下载图片和生成配置文件,可以通过SD卡下载,和串口下载两种方式(很慢),SD卡要至少1G,太小用不了,使用迪文的方法进行格式化。

<3>:关节在与串口中断接收的软件书写。

  串口每次接受一个字节,所以要有接收结束的判断。

 在软件上的处理是,2Ms没有串口中断就认为是接收完成。此处应该做好几个标志位,方便主程序中使用。

 其中在调试的时候遇到了几个问题,上电后不断的进入串口中断就收,原因在于硬件的链接没有连接好导致的。

<3>另外的两个电机使用的是类似l298N的直流电机驱动,能够驱动wth3615.。它的引脚定义如图

。只要控制PWM和ENA即可控制直流电机了

PWM使用的还是tim8的通道,ENA通过控制引脚的高低电平,来控制。

 

(4)实现掉电存储,五个电机的速度参数

  <1>使用了二维数组作为缓冲区。

5行 100列   

往flash中写入数据,一定要写入缓冲区,然后统一的写入到falsh中,因为flash的擦写次数是有限的。

下面是对Flash 小结

FLASh 必须是先擦 后 写

下面的函数是分析案例

voidFLASH_WriteByte(u32 addr ,u16 flashdata1)

{

 FLASH_Unlock();//解锁FLASH编程擦除控制器

   FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);

 

            //********************************************************************

 //  FLASH_FLAG_BSY       1.FLASH忙标志位. 因为BSY位为1时,不能对任何FPEC

                             寄存器执行写操作,所以必须要等BSY位为0时,才                                                 能执行闪存操作

 //   FLASH_FLAG_EOP     2.  FLASH操作结束标志位

 //    FLASH_FLAG_PGERR  3. FLASH编写错误标志位

       STM32在执行编程操作前,会先检查要编程的地址                                                    是否被擦除,如果没有,则不进行编程,并置                                                               FLASH_SR寄存器的PGERR位为1。唯一例外的是,                                                                   当要编程的数据为0X0000时,即使未擦除,也会                                                                          进行编程,因为0X0000即使擦除也可以正确编程

 //      FLASH_FLAG_WRPRTERR       FLASH页面写保护错误标净       

          //***********************************************************************/  

   FLASH_ErasePage(FLASH_START_ADDR);

   FLASH_ProgramHalfWord(FLASH_START_ADDR+(addr+i)*2,dat);

   FLASH_Lock();//锁定FLASH编程擦除控制

}

   基本顺序:解锁->清除标志位(可以不要)->擦除->写半字->清楚标志位(也可以不要)->上锁。

 

 +++++使用如下步骤对选项字节进行擦除

      1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。 

      2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。

      3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。 

      4.设置FLASH_CR寄存器的STRT位为1。

      5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。

      6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。

 +++++7.读出选项字节并验证数据。  

++++++++如下步骤对选项字节进行编程

      1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。 

      2.解锁FLASH_CR寄存器的OPTWRE位。即打开写使能。 

      3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。 

      4.写入要编程的半字到指定的地址。启动编程操作。

      5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。

      6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。

      7.读出写入的选项字节并验证数据。对选项字节编程时,FPEC使用半字中的低字节并自动地         计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码         始终是正确的。

   如果 FLASH_START_ADDR是宏定义的0x8000000+2048*255

    1. 0x8000000是Flash的起始地址

    2. 2048是因为我用的是大容量芯片,根据上一笔记Flash地址可以看出芯片每页容量2K,即2048字节,

    3. 255表示芯片的最后一页,这个根据不同芯片而定。之所以从后面页写起可以防止储存数据破坏用户程序。

    4. addr*2是因为每个数据占用2字节(半字),虽然写入的是1字节数据,但是编程是2字节为单位,

             也就是说一个字节的数据也会占用两个字节地址。

 

0 0
原创粉丝点击