简单,虽然这里讲一大堆但是在编程实现时你就看到了就几行搞定;不容易出错,效率最高,你可以想象的到如果涉及的变量越多操作的代码越多需要考虑的可能性越多也越容易错;便于封装和功能扩展,比如你想做一个AD采样值与电机位置按一个比例同步的程序即转滑阻电机跟着动的小玩意儿,稍微改改把AD采样值赋给计步值其它都不用管了。 先说第一个数据的输出,spwm数组256个,如果不考虑极性则数据位置只和stepcounter的低8位有关,因此A相数据用stepcounter的低8位作指针从数组取数就可以(A相0值点为计步0值点),B相与A相相差为90度,所以A=0,1,2,。。。255,0 。。。则B=128,129,130,。。。127,128。。。能看出来吗?(A的数据指针+128)%256等同于 A的数据指针^128就是B的数据指针。
程序上这样写:
A通道值=spwm数组[(u8)stepcounter];
B通道值=spwm数组[(u8)stepcounter^128];
这里数组大小是256,所以一个逻辑异或就解决,如果你非要取大小是100个的话你就得(point+50)%100才能找到B相位点了。
第二个是极性控制,假定初始时A=0,B=0,C8=0,C7=0,A=0 B=0表示A相B相正半周的极性,C8是stepcounter第8位的值(最低位为0),之所以为8是前面提到过的条件即视低8位为微步,C7第7位,现在stepcounter计数到0和256,A相应该翻转一次,计数到128和128+256,B相翻转一次,由此列出真值表把逻辑关系提取出来: C8 C7 A B counter值