入门级的步进驱动的功能框图如下
如果降低要求,电流采样这边直接用比较器,用DAC输出参考,和采样的电流进行比较,MCU只处理斩波反馈的信号,这样,编程难度更低。
OK,从最简单的开始,正弦表。
到网上找了一通,甚至找了正弦表的发生软件,以及MTLAB来做,但是都没有找到合适的资料,好吧,与其浪费时间来做这个搜集工作,还不如自己用EXCEL计算出来。12位DAC输出,那最大4095,用EXCEL计算以后,得到的128细分正弦表如下:
uc16 Sine12bit[129] = {0,50, 100, 151, 201, 251, 301, 351, 401, 451, 501, 551, 601, 651, 700
, 750, 799, 848, 897, 946, 995,1044,1092,1141,1189,1237,1285,1332,1380,1427,1474,1521,1567
,1613,1659,1705,1751,1796,1841,1886,1930,1975,2018,2062,2105,2148,2191,2233,2275,2317,2358,2399
,2439,2480,2519,2559,2598,2636,2675,2713,2750,2787,2824,2860,2896,2931,2966,3000,3034,3068,3101
,3133,3165,3197,3228,3259,3289,3319,3348,3377,3405,3433,3460,3486,3512,3538,3563,3588,3611,3635,3658
,3680,3702,3723,3744,3764,3783,3802,3821,3838,3856,3872,3888,3904,3919,3933,3947,3960,3972,3984,3996
,4006,4016,4026,4035,4043,4051,4058,4064,4070,4075,4080,4084,4087,4090,4092,4094,4094,4095};
然后配置程序,一输出,完美!
第二个需要做的工作是,脉冲输入。
计划先反转和脱机功能不做,先让电机转起来再说。查找STM32的资料,发现这个很好实现。用外部中断9来触发DMA的输出。
如果你是一个单片机老手,这个做起来当然简单,但是我对DMA了解不够,但是还算是比较顺利,程序编写后,功能完全满足要求。
然后难一点的东西来了,细分的输入处理。
细分功能的实现,一开始低估了细分功能实现的难度,
根据目前市面上驱动器的特点,以及在运行中切换细分可能造成的丢步。
高细分切换到低细分时会丢掉小于一个低细分角度的旋转,比如,从128细分下的125阶梯切换到2细分时,125~128的四个阶梯会自动丢失掉
(整步和256细分,后面需要再进行添加)
设置驱动器的细分设置在上电初始化中完成。
程序的设计流程如下:
1、查询细分设置端口的电平,以确定“细分”
2、根据细分,分配DMA空间
3、计算DMA中存入的“梯度正弦值”,初始化两个DMA,并赋值DMA的基址。
4、外部脉冲触发DAC输出,DAC的数据寄存器绑定DMA1和DMA的地址,直接从DMA中取值
设计完成上面的工作,就可以开始PWM的输出了,PWM的输出如果不处理反馈,功能也很容易实现,简单的程序可以设置固定的占空比,以及加入一定的死区就OK了,程序编写完成以后,调试OK,一切进展看似很顺利。
对步进驱动技术有兴趣的朋友,可以加入迪莫驱动技术群:104155124,我们将每周安排时间在群内一起讨论技术问题。
用户402158 2014-8-14 16:36
用户1420144 2014-6-18 21:56