In my last week's work, I discovered that the motor's movement is not continueous or consistent with the input of a sine wave, as a result of the triple half bridge performace. So I decided to recalibrate the drive function to map the real angle of the motor to output signals that can generate that angle. To do that, I need a rotary encoder, which can measure the angle at each output configuration. Because I had the accelarometer working during the input device week and can be conveniently used to measure the angle, I can save the money to purchase a encoder.
The scheme works as following: I used the sine wave (shown above) to drive the motor very slowly (~0.1deg/s) and fix the accelerometer on the rotator of the motor and read out the acceleration on x and y axis. Then the angle of the motor can be easily determined by tan(\theta) = AcX/AcY. I wrote some python code to read the data through serial and saved them in to file as well as plotting it in real time. The code is following:
import serial import numpy import matplotlib.pyplot as plt from drawnow import drawnow def updateplot(): // plot function plt.title('Calibration') plt.ylabel('AcX') plt.plot(x,y2) plt.plot(x,y3) ser = serial.Serial('COM6',9600) ser.setDTR() ser.flushInput() count = 0 x =  y1 =  y2 =  y3 =  plt.ion() //use interactive mode for i in range(8000): x.append(count) data = str(ser.readline(),'utf-8') // read from serial data=data.strip('\n') //get rid of return data1,data2,data3 = data.split(',') // split different data field y1=numpy.append(y1,int(data1)) // create arrays y2=numpy.append(y2,int(data2)) y3=numpy.append(y3,int(data3)) count += 1 drawnow(updateplot) //update figure ser.close() numpy.savetxt('cali_v2', (y1,y2,y3)) // save data
The measured AcX and AcY is shown below.
After processing the data into angle and averaging between different sub-rotations in matlab, I get the following calibration curve. From this curve the stalling behaviour is evident.
By interplot the output waveform with this calibration curve, I thus get the calibrated output PWM waveform as following.