Thursday, January 29, 2009

New arrival

Two PWM driver cards from the Reprap store arrived a couple days ago. I should have a chance to solder them up tonight and see if they do the trick. Now I just need a motor to play with.

Monday, January 26, 2009

Encoder has arrived

I purchased a BEI encoder from ebay a while ago and now have it in my hot hands. I intend to attach it to whatever motor I use as velocity feedback. That should allow me to create some sort of vector control for the motor. I've been reading a lot, but I am still unsure how the math works, but at least I think I know what the pieces are.

angular velocity of the rotating magnetic field, or frequency of the output (I can control this)
total voltage (I can control this)
output current (I can measure this)
speed difference between magnetic field and rotor, also called slip (I can measure this)

My thoughts are that the gas pedal will be attached to a pot that will essentially be a torque request. The controller will always output a frequency a bit faster than the moving speed of the rotor based on the motors slip. Based on the torque request, the voltage will be changed to get the requested current.

We'll see. Now I just need a few hundred volts dc and a motor to try it on.

Friday, January 23, 2009

Working!

My sanguino program is working quite well now. I used direct control of timer0 and direct port access on port C to get pwm of 6 normal outputs.I ran into a problem of not being able to generate a fast enough frequency, so I had to reduce the resolution of my sin wave array from a value every 2 degrees to every 6 degrees. I think this should still be fine for motor control, it just may produce some wicked harmonics. I'm still waiting for an encoder I bought off ebay, and two firing cards from the Reprap store.

Next step is to find a small three phase motor, some sort of shunt for measuring the current and start getting things to spin. Woot!

Wednesday, January 21, 2009

Commissioned Art


Check it out. Its meant to explore the blurring of the line between technology and humanity. Bender as Manet's Ophelia

Latest code

I've managed to generate the three phase sin wave output without using analog write commands or any delay functions. It uses some lower level commands within the Arduino programming environment.

It works to speed up and slow down the phases, but I haven't been able to control the maximum voltage yet. I think I'm running into a problem of the interrupt service routine being too long.

Cheers.

// this will be an attempt to change how the pwm is done, and use interupts and direct port access with a higher speed

// port C > 7= pin 23
// port C > 6= pin 22
// port C > 5= pin 21
// port C > 4= pin 20
// port C > 3= pin 19
// port C > 2= pin 18
// port C > 1= pin 17
// port C > 0= pin 16

#include
#include

ISR(TIMER0_COMPA_vect) {
callback();
}

boolean ledpin_1 = 1; // 0 or 1 for if the 1st led should be on
boolean ledpin_2 = 1; // 0 or 1 for if the 2nd led should be on
boolean ledpin_3 = 1; // 0 or 1 for if the 3rd led should be on
boolean ledpin_4 = 1; // 0 or 1 for if the 4th led should be on
boolean ledpin_5 = 1; // 0 or 1 for if the 5th led should be on
boolean ledpin_6 = 1; // 0 or 1 for if the 6th led should be on
int pot_value = 0; // input for the potentiometer used to control frequency
int analog_pin = 0; // input pin for pot

int freq = 0; //this is the counter that is counting up the bins
int freqmax = 10; //this will be the amount the counter counts up before going to the next part of the array, by changing this we can alter the frequency

int sinarray [] = {0,0,87,0,0,87,3,0,85,0,0,88,7,0,83,0,0,90,10,0,81,0,0,91,14,0,79,0,0,93,17,0,77,0,0,94,21,0,74,0,0,95,24,0,72,0,0,96,28,0,69,0,0,97,31,0,67,0,0,98,34,0,64,0,0,98,37,0,62,0,0,99,41,0,59,0,0,99,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,100,59,0,41,0,0,99,62,0,37,0,0,99,64,0,34,0,0,98,67,0,31,0,0,98,69,0,28,0,0,97,72,0,24,0,0,96,74,0,21,0,0,95,77,0,17,0,0,94,79,0,14,0,0,93,81,0,10,0,0,91,83,0,7,0,0,90,85,0,3,0,0,88,87,0,0,0,0,87,88,0,0,3,0,85,90,0,0,7,0,83,91,0,0,10,0,81,93,0,0,14,0,79,94,0,0,17,0,77,95,0,0,21,0,74,96,0,0,24,0,72,97,0,0,28,0,69,98,0,0,31,0,67,98,0,0,34,0,64,99,0,0,37,0,62,99,0,0,41,0,59,100,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,99,0,0,59,0,41,99,0,0,62,0,37,98,0,0,64,0,34,98,0,0,67,0,31,97,0,0,69,0,28,96,0,0,72,0,24,95,0,0,74,0,21,94,0,0,77,0,17,93,0,0,79,0,14,91,0,0,81,0,10,90,0,0,83,0,7,88,0,0,85,0,3,87,0,0,87,0,0,85,0,0,88,3,0,83,0,0,90,7,0,81,0,0,91,10,0,79,0,0,93,14,0,77,0,0,94,17,0,74,0,0,95,21,0,72,0,0,96,24,0,69,0,0,97,28,0,67,0,0,98,31,0,64,0,0,98,34,0,62,0,0,99,37,0,59,0,0,99,41,0,56,0,0,100,44,0,53,0,0,100,47,0,50,0,0,100,50,0,47,0,0,100,53,0,44,0,0,100,56,0,41,0,0,99,59,0,37,0,0,99,62,0,34,0,0,98,64,0,31,0,0,98,67,0,28,0,0,97,69,0,24,0,0,96,72,0,21,0,0,95,74,0,17,0,0,94,77,0,14,0,0,93,79,0,10,0,0,91,81,0,7,0,0,90,83,0,3,0,0,88,85,0,0,0,0,87,87,0,0,3,0,85,88,0,0,7,0,83,90,0,0,10,0,81,91,0,0,14,0,79,93,0,0,17,0,77,94,0,0,21,0,74,95,0,0,24,0,72,96,0,0,28,0,69,97,0,0,31,0,67,98,0,0,34,0,64,98,0,0,37,0,62,99,0,0,41,0,59,99,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,100,0,0,59,0,41,99,0,0,62,0,37,99,0,0,64,0,34,98,0,0,67,0,31,98,0,0,69,0,28,97,0,0,72,0,24,96,0,0,74,0,21,95,0,0,77,0,17,94,0,0,79,0,14,93,0,0,81,0,10,91,0,0,83,0,7,90,0,0,85,0,3,88,0,0,87,0,0,87,0,0,88,3,0,85,0,0,90,7,0,83,0,0,91,10,0,81,0,0,93,14,0,79,0,0,94,17,0,77,0,0,95,21,0,74,0,0,96,24,0,72,0,0,97,28,0,69,0,0,98,31,0,67,0,0,98,34,0,64,0,0,99,37,0,62,0,0,99,41,0,59,0,0,100,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,99,59,0,41,0,0,99,62,0,37,0,0,98,64,0,34,0,0,98,67,0,31,0,0,97,69,0,28,0,0,96,72,0,24,0,0,95,74,0,21,0,0,94,77,0,17,0,0,93,79,0,14,0,0,91,81,0,10,0,0,90,83,0,7,0,0,88,85,0,3,0,0,87,87,0,0,0,0,85,88,0,0,3,0,83,90,0,0,7,0,81,91,0,0,10,0,79,93,0,0,14,0,77,94,0,0,17,0,74,95,0,0,21,0,72,96,0,0,24,0,69,97,0,0,28,0,67,98,0,0,31,0,64,98,0,0,34,0,62,99,0,0,37,0,59,99,0,0,41,0,56,100,0,0,44,0,53,100,0,0,47,0,50,100,0,0,50,0,47,100,0,0,53,0,44,100,0,0,56,0,41,99,0,0,59,0,37,99,0,0,62,0,34,98,0,0,64,0,31,98,0,0,67,0,28,97,0,0,69,0,24,96,0,0,72,0,21,95,0,0,74,0,17,94,0,0,77,0,14,93,0,0,79,0,10,91,0,0,81,0,7,90,0,0,83,0,3,88,0,0,85};


int max_volts = 95; // controls amplitude of the sin wave
int analog_volt = 1;

int value_pwm_1 = 0; // variable to keep the actual value_pwm_1
int array_tag_1 = 0; // where to get first value for phase 1 positive from array, first value in array is tagged at 0
int on_pulses_pin1 = 0; // counter for how many pulses pin 1 has been on

int value_pwm_2 = 0; // variable to keep the actual value_pwm_2
int array_tag_2 = 1; // where to get first value for phase 1 negative from array
int on_pulses_pin2 = 0;

int value_pwm_3 = 0; // variable to keep the actual value_pwm_2
int array_tag_3 = 4; // where to get first value for phase 2 positive from array
int on_pulses_pin3 = 0;

int value_pwm_4 = 0; // variable to keep the actual value_pwm_2
int array_tag_4 = 5; // where to get first value for phase 2 negative from array
int on_pulses_pin4 = 0;

int value_pwm_5 = 0; // variable to keep the actual value_pwm_2
int array_tag_5 = 2; // where to get first value for phase 3 positive from array
int on_pulses_pin5 = 0;

int value_pwm_6 = 0; // variable to keep the actual value_pwm_2
int array_tag_6 = 3; // where to get first value for phase 3 negative from array
int on_pulses_pin6 = 0;


void setup()

{
TIMSK0 = (1< // flag a (OCF0A) is written
TCCR0A = (0<TCCR0B = (0<OCR0A = 200; // this is the CTC value, this value gets changed to
// change the resolution of the counter
DDRC = 255; // this sets all of port C to outputs.
}


// This should be the routine called everytime the timer gets to the value of OCR0A
void callback()
{

if (freq >= freqmax)

{
freq = 0;
if (array_tag_1 < 1074) // 1074 is the last the last array tag for phase 1 postive, so below that we add 6 to each tag to get to the next spot for each phase in the array
{
array_tag_1 = array_tag_1 + 6;
array_tag_2 = array_tag_2 + 6;
array_tag_3 = array_tag_3 + 6;
array_tag_4 = array_tag_4 + 6;
array_tag_5 = array_tag_5 + 6;
array_tag_6 = array_tag_6 + 6;
}

else
{ // after 1074 we reset all the array tags to their original value
array_tag_1 = 0; // this resets the array counters back to zero
array_tag_2 = 1;
array_tag_3 = 4;
array_tag_4 = 5;
array_tag_5 = 2;
array_tag_6 = 3;
}
}

else
{
freq = freq + 1;
on_pulses_pin1 = (sinarray[array_tag_1] * freqmax / 100);
on_pulses_pin2 = (sinarray[array_tag_2] * freqmax / 100);
on_pulses_pin3 = (sinarray[array_tag_3] * freqmax / 100);
on_pulses_pin4 = (sinarray[array_tag_4] * freqmax / 100);
on_pulses_pin5 = (sinarray[array_tag_5] * freqmax / 100);
on_pulses_pin6 = (sinarray[array_tag_6] * freqmax / 100);
}

//PIN 1
if (on_pulses_pin1>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_1 = 1;
}
else
{
ledpin_1 = 0;
}
//PIN 2
if (on_pulses_pin2>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_2 = 1;
}
else
{
ledpin_2 = 0;
}
//PIN 3
if (on_pulses_pin3>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_3 = 1;
}
else
{
ledpin_3 = 0;
}
//PIN 4
if (on_pulses_pin4>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_4 = 1;
}
else
{
ledpin_4 = 0;
}
//PIN 5
if (on_pulses_pin5>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_5 = 1;
}
else
{
ledpin_5 = 0;
}
//PIN 6
if (on_pulses_pin6>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
ledpin_6 = 1;
}
else
{
ledpin_6 = 0;
}


// Set all outputs
PORTC = (0<

}


void loop()

{

// pot_value = analogRead(analog_pin) / 100; // using a pot to control the frequency
// max_volts = analogRead(analog_volt) / 4; // changes the max voltage based on the second pot

pot_value = 100;


// port A looks like the analog inputs
// port B looks safe to play with
// port C looks safe to play with
// port D looks like it has the tx and rx pins

// Disable interrupts
// cli();
// Enable interrupts
// sei();

}

Monday, January 12, 2009

Arduino Libraries

It seems that the timerone.h library from the arduino site does not work with the sanguino. I'm heading to New York for the week and will take the datasheets with me to see if I can figure out why. It may be something simple like the Library references the wrong pins, or the wrong control registers. Here is the current non-functioning attempt at code using an interupt to time the Pulse width instead of a delay function.

//this will be an attempt to change how the pwm is done, and use interupts with a higher speed



#include "TimerOne.h"

int freq = 0; //this is the counter that is counting up the bins
int freqmax = 1000; //this will be the amount the counter counts up before going to the next part of the array, by changing this we can alter the frequency
int sinarray [] = {0,0,87,0,0,87,3,0,85,0,0,88,7,0,83,0,0,90,10,0,81,0,0,91,14,0,79,0,0,93,17,0,77,0,0,94,21,0,74,0,0,95,24,0,72,0,0,96,28,0,69,0,0,97,31,0,67,0,0,98,34,0,64,0,0,98,37,0,62,0,0,99,41,0,59,0,0,99,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,100,59,0,41,0,0,99,62,0,37,0,0,99,64,0,34,0,0,98,67,0,31,0,0,98,69,0,28,0,0,97,72,0,24,0,0,96,74,0,21,0,0,95,77,0,17,0,0,94,79,0,14,0,0,93,81,0,10,0,0,91,83,0,7,0,0,90,85,0,3,0,0,88,87,0,0,0,0,87,88,0,0,3,0,85,90,0,0,7,0,83,91,0,0,10,0,81,93,0,0,14,0,79,94,0,0,17,0,77,95,0,0,21,0,74,96,0,0,24,0,72,97,0,0,28,0,69,98,0,0,31,0,67,98,0,0,34,0,64,99,0,0,37,0,62,99,0,0,41,0,59,100,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,99,0,0,59,0,41,99,0,0,62,0,37,98,0,0,64,0,34,98,0,0,67,0,31,97,0,0,69,0,28,96,0,0,72,0,24,95,0,0,74,0,21,94,0,0,77,0,17,93,0,0,79,0,14,91,0,0,81,0,10,90,0,0,83,0,7,88,0,0,85,0,3,87,0,0,87,0,0,85,0,0,88,3,0,83,0,0,90,7,0,81,0,0,91,10,0,79,0,0,93,14,0,77,0,0,94,17,0,74,0,0,95,21,0,72,0,0,96,24,0,69,0,0,97,28,0,67,0,0,98,31,0,64,0,0,98,34,0,62,0,0,99,37,0,59,0,0,99,41,0,56,0,0,100,44,0,53,0,0,100,47,0,50,0,0,100,50,0,47,0,0,100,53,0,44,0,0,100,56,0,41,0,0,99,59,0,37,0,0,99,62,0,34,0,0,98,64,0,31,0,0,98,67,0,28,0,0,97,69,0,24,0,0,96,72,0,21,0,0,95,74,0,17,0,0,94,77,0,14,0,0,93,79,0,10,0,0,91,81,0,7,0,0,90,83,0,3,0,0,88,85,0,0,0,0,87,87,0,0,3,0,85,88,0,0,7,0,83,90,0,0,10,0,81,91,0,0,14,0,79,93,0,0,17,0,77,94,0,0,21,0,74,95,0,0,24,0,72,96,0,0,28,0,69,97,0,0,31,0,67,98,0,0,34,0,64,98,0,0,37,0,62,99,0,0,41,0,59,99,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,100,0,0,59,0,41,99,0,0,62,0,37,99,0,0,64,0,34,98,0,0,67,0,31,98,0,0,69,0,28,97,0,0,72,0,24,96,0,0,74,0,21,95,0,0,77,0,17,94,0,0,79,0,14,93,0,0,81,0,10,91,0,0,83,0,7,90,0,0,85,0,3,88,0,0,87,0,0,87,0,0,88,3,0,85,0,0,90,7,0,83,0,0,91,10,0,81,0,0,93,14,0,79,0,0,94,17,0,77,0,0,95,21,0,74,0,0,96,24,0,72,0,0,97,28,0,69,0,0,98,31,0,67,0,0,98,34,0,64,0,0,99,37,0,62,0,0,99,41,0,59,0,0,100,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,99,59,0,41,0,0,99,62,0,37,0,0,98,64,0,34,0,0,98,67,0,31,0,0,97,69,0,28,0,0,96,72,0,24,0,0,95,74,0,21,0,0,94,77,0,17,0,0,93,79,0,14,0,0,91,81,0,10,0,0,90,83,0,7,0,0,88,85,0,3,0,0,87,87,0,0,0,0,85,88,0,0,3,0,83,90,0,0,7,0,81,91,0,0,10,0,79,93,0,0,14,0,77,94,0,0,17,0,74,95,0,0,21,0,72,96,0,0,24,0,69,97,0,0,28,0,67,98,0,0,31,0,64,98,0,0,34,0,62,99,0,0,37,0,59,99,0,0,41,0,56,100,0,0,44,0,53,100,0,0,47,0,50,100,0,0,50,0,47,100,0,0,53,0,44,100,0,0,56,0,41,99,0,0,59,0,37,99,0,0,62,0,34,98,0,0,64,0,31,98,0,0,67,0,28,97,0,0,69,0,24,96,0,0,72,0,21,95,0,0,74,0,17,94,0,0,77,0,14,93,0,0,79,0,10,91,0,0,81,0,7,90,0,0,83,0,3,88,0,0,85};
int pot_value = 0; // input for the potentiometer used to control frequency
int analog_pin = 0; // input pin for pot

int max_volts = 0; // controls amplitude of the sin wave
int analog_volt = 1;

int value_pwm_1 = 0; // variable to keep the actual value_pwm_1
int ledpin_1 = 3; // light connected to digital pin 3
int array_tag_1 = 0; // where to get first value for phase 1 positive from array, first value in array is tagged at 0
int on_pulses_pin1 = 0;

int value_pwm_2 = 0; // variable to keep the actual value_pwm_2
int ledpin_2 = 4; // light connected to digital pin 4
int array_tag_2 = 1; // where to get first value for phase 1 negative from array
int on_pulses_pin2 = 0;

int value_pwm_3 = 0; // variable to keep the actual value_pwm_2
int ledpin_3 = 12; // light connected to digital pin 12
int array_tag_3 = 4; // where to get first value for phase 2 positive from array
int on_pulses_pin3 = 0;

int value_pwm_4 = 0; // variable to keep the actual value_pwm_2
int ledpin_4 = 13; // light connected to digital pin 13
int array_tag_4 = 5; // where to get first value for phase 2 negative from array
int on_pulses_pin4 = 0;

int value_pwm_5 = 0; // variable to keep the actual value_pwm_2
int ledpin_5 = 14; // light connected to digital pin 14
int array_tag_5 = 2; // where to get first value for phase 3 positive from array
int on_pulses_pin5 = 0;

int value_pwm_6 = 0; // variable to keep the actual value_pwm_2
int ledpin_6 = 15; // light connected to digital pin 15
int array_tag_6 = 3; // where to get first value for phase 3 negative from array
int on_pulses_pin6 = 0;

void setup()
{
pinMode(7, OUTPUT); // using an LED on pin 7 to indicate the completion of one complete cycle on phase 1
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
Timer1.initialize(100); // initialize timer1, and set a 1/1000 second period, can this be changed dynamically in the program?
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
}

void callback()
{


if (freq >= freqmax)
{
freq = 0;

if (array_tag_1 < 1074)

{ // 1074 is the last the last array tag for phase 1 postive, so below that we add 6 to each tag to get to the next spot for each phase in the array

array_tag_1 = array_tag_1 + 6;
array_tag_2 = array_tag_2 + 6;
array_tag_3 = array_tag_3 + 6;
array_tag_4 = array_tag_4 + 6;
array_tag_5 = array_tag_5 + 6;
array_tag_6 = array_tag_6 + 6;
}

else
{ // after 1074 we reset all the array tags to their original value
array_tag_1 = 0; // this resets the array counters back to zero
array_tag_2 = 1;
array_tag_3 = 4;
array_tag_4 = 5;
array_tag_5 = 2;
array_tag_6 = 3;

}

}
else
{
freq = freq + 1;
on_pulses_pin1 = (sinarray[array_tag_1] * freqmax / 100);
on_pulses_pin2 = (sinarray[array_tag_2] * freqmax / 100);
on_pulses_pin3 = (sinarray[array_tag_3] * freqmax / 100);
on_pulses_pin4 = (sinarray[array_tag_4] * freqmax / 100);
on_pulses_pin5 = (sinarray[array_tag_5] * freqmax / 100);
on_pulses_pin6 = (sinarray[array_tag_6] * freqmax / 100);

if (on_pulses_pin1>freq) //these if's check to see if each pins counter has reached its max and then turns the pins on or off as needed
{
digitalWrite(ledpin_1, HIGH);
}

else
{
digitalWrite(ledpin_1, LOW);
}

if (on_pulses_pin2>freq) //
{
digitalWrite(ledpin_2, HIGH);
}

else
{
digitalWrite(ledpin_2, LOW);
}

if (on_pulses_pin3>freq) //
{
digitalWrite(ledpin_3, HIGH);
}

else
{
digitalWrite(ledpin_3, LOW);
}

if (on_pulses_pin4>freq) //
{
digitalWrite(ledpin_4, HIGH);
}

else
{
digitalWrite(ledpin_4, LOW);
}

if (on_pulses_pin5>freq) //
{
digitalWrite(ledpin_5, HIGH);
}

else
{
digitalWrite(ledpin_5, LOW);
}

if (on_pulses_pin6>freq) //
{
digitalWrite(ledpin_6, HIGH);
}

else
{
digitalWrite(ledpin_6, LOW);
}




}

}


void loop()
{
pot_value = analogRead(analog_pin) / 100; // using a pot to control the frequency
max_volts = analogRead(analog_volt) / 4; // changes the max voltage based on the second pot


}

Sunday, January 11, 2009

OK, now tell us what the hell they are.

Dear Dr. Dawg,

Sorry for posting something a little obscure. IGBT's or Insulated Gate Bipolar Transistors, are fast acting high power semiconductor switches. The units I have are capable of switching 200 amps at 1200 Volts at a significantly high switching rate. This is what makes it possible to use pulse width modulation to turn the switches off and on really fast to generate a variable alternating current output from a dc source, like a big battery pack.

And if anyone knows how to use the timers directly on a Sanguino, please send me a note.

Saturday, January 10, 2009

IGBT's have arrived!



Three fully functional 200A (450 peak!) 1200 V IGBT blocks arrived yesterday. I paid about 90 dollars Canadian including shipping and handling. These are generally about 2-300 dollars a piece new, so I think I did okay. They are actually smaller than I thought they'd be. I guess newer semiconductors produce less heat and so they can make the package smaller.

Wednesday, January 7, 2009

New book arriving

I looked up some relevant courses at UBC in Electrical Engineering in order to find relevant textbooks. I found a course that was titled "Electro-mechanical Energy Conversion and Transmission" which sounded pretty good. However the textbook "Electric Machinery Fundamentals" from Stephen Chapman is a $200 plus textbook. I found it used for about $30 on Amazon. Woo! Still waiting for the encoder and the IGBTs from ebay.
I need to learn how to seperate the magetizing current from the torque producing current so I can figure out an algorithm for feed back and control of the frequency and voltage output. I may just use a Voltage/frequency table to start, but I'd like to learn how to calculate the real output required for Vector Control.
On a side note, I had a comment from MSimon, who I think is one of the avid contibuters to the Talk-Polywell fusion forum which I read every morning. If you're at all interested in super-conducting magnets, plasma physics, massive pulsed capacitor banks, or other energy geek type stuff check it out.

Tuesday, January 6, 2009

Political Interjection

How does this guy get appointed to the Senate?

http://www.theglobeandmail.com/servlet/story/RTGAM.20090106.wsenate06/BNStory/politics/home

Call me old fashioned, call me judgmental, but pony tails and more than one ring per hand is "not senate material."

3 phase sin wave

I've managed to generate a 3 phase sin wave on the sanguino. Its just pulsing LEDs at this point, but I am able to modulate the frequency and the amplitude. Still have lots of work to do as this current code uses the analogWrite command which does PWM at about 490 Hz. I'm going to need this to work a lot faster. Also I've used a delay command to change the frequency. I'd like to come up with a way to not use any delays in the program. Here it is if anyone is interested:

// 3 phase sin wave output
// by Swamijake

int sinarray [] = {0,0,87,0,0,87,3,0,85,0,0,88,7,0,83,0,0,90,10,0,81,0,0,91,14,0,79,0,0,93,17,0,77,0,0,94,21,0,74,0,0,95,24,0,72,0,0,96,28,0,69,0,0,97,31,0,67,0,0,98,34,0,64,0,0,98,37,0,62,0,0,99,41,0,59,0,0,99,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,100,59,0,41,0,0,99,62,0,37,0,0,99,64,0,34,0,0,98,67,0,31,0,0,98,69,0,28,0,0,97,72,0,24,0,0,96,74,0,21,0,0,95,77,0,17,0,0,94,79,0,14,0,0,93,81,0,10,0,0,91,83,0,7,0,0,90,85,0,3,0,0,88,87,0,0,0,0,87,88,0,0,3,0,85,90,0,0,7,0,83,91,0,0,10,0,81,93,0,0,14,0,79,94,0,0,17,0,77,95,0,0,21,0,74,96,0,0,24,0,72,97,0,0,28,0,69,98,0,0,31,0,67,98,0,0,34,0,64,99,0,0,37,0,62,99,0,0,41,0,59,100,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,99,0,0,59,0,41,99,0,0,62,0,37,98,0,0,64,0,34,98,0,0,67,0,31,97,0,0,69,0,28,96,0,0,72,0,24,95,0,0,74,0,21,94,0,0,77,0,17,93,0,0,79,0,14,91,0,0,81,0,10,90,0,0,83,0,7,88,0,0,85,0,3,87,0,0,87,0,0,85,0,0,88,3,0,83,0,0,90,7,0,81,0,0,91,10,0,79,0,0,93,14,0,77,0,0,94,17,0,74,0,0,95,21,0,72,0,0,96,24,0,69,0,0,97,28,0,67,0,0,98,31,0,64,0,0,98,34,0,62,0,0,99,37,0,59,0,0,99,41,0,56,0,0,100,44,0,53,0,0,100,47,0,50,0,0,100,50,0,47,0,0,100,53,0,44,0,0,100,56,0,41,0,0,99,59,0,37,0,0,99,62,0,34,0,0,98,64,0,31,0,0,98,67,0,28,0,0,97,69,0,24,0,0,96,72,0,21,0,0,95,74,0,17,0,0,94,77,0,14,0,0,93,79,0,10,0,0,91,81,0,7,0,0,90,83,0,3,0,0,88,85,0,0,0,0,87,87,0,0,3,0,85,88,0,0,7,0,83,90,0,0,10,0,81,91,0,0,14,0,79,93,0,0,17,0,77,94,0,0,21,0,74,95,0,0,24,0,72,96,0,0,28,0,69,97,0,0,31,0,67,98,0,0,34,0,64,98,0,0,37,0,62,99,0,0,41,0,59,99,0,0,44,0,56,100,0,0,47,0,53,100,0,0,50,0,50,100,0,0,53,0,47,100,0,0,56,0,44,100,0,0,59,0,41,99,0,0,62,0,37,99,0,0,64,0,34,98,0,0,67,0,31,98,0,0,69,0,28,97,0,0,72,0,24,96,0,0,74,0,21,95,0,0,77,0,17,94,0,0,79,0,14,93,0,0,81,0,10,91,0,0,83,0,7,90,0,0,85,0,3,88,0,0,87,0,0,87,0,0,88,3,0,85,0,0,90,7,0,83,0,0,91,10,0,81,0,0,93,14,0,79,0,0,94,17,0,77,0,0,95,21,0,74,0,0,96,24,0,72,0,0,97,28,0,69,0,0,98,31,0,67,0,0,98,34,0,64,0,0,99,37,0,62,0,0,99,41,0,59,0,0,100,44,0,56,0,0,100,47,0,53,0,0,100,50,0,50,0,0,100,53,0,47,0,0,100,56,0,44,0,0,99,59,0,41,0,0,99,62,0,37,0,0,98,64,0,34,0,0,98,67,0,31,0,0,97,69,0,28,0,0,96,72,0,24,0,0,95,74,0,21,0,0,94,77,0,17,0,0,93,79,0,14,0,0,91,81,0,10,0,0,90,83,0,7,0,0,88,85,0,3,0,0,87,87,0,0,0,0,85,88,0,0,3,0,83,90,0,0,7,0,81,91,0,0,10,0,79,93,0,0,14,0,77,94,0,0,17,0,74,95,0,0,21,0,72,96,0,0,24,0,69,97,0,0,28,0,67,98,0,0,31,0,64,98,0,0,34,0,62,99,0,0,37,0,59,99,0,0,41,0,56,100,0,0,44,0,53,100,0,0,47,0,50,100,0,0,50,0,47,100,0,0,53,0,44,100,0,0,56,0,41,99,0,0,59,0,37,99,0,0,62,0,34,98,0,0,64,0,31,98,0,0,67,0,28,97,0,0,69,0,24,96,0,0,72,0,21,95,0,0,74,0,17,94,0,0,77,0,14,93,0,0,79,0,10,91,0,0,81,0,7,90,0,0,83,0,3,88,0,0,85};

// generated the array in excel, it is 6 outputs (one positive and one negative for each phase) times 180 bins for 2 degree resolution

int pot_value = 0; // input for the potentiometer used to control frequency
int analog_pin = 0; // input pin for pot

int max_volts = 0; // controls amplitude of the sin wave
int analog_volt = 1;

int value_pwm_1 = 0; // variable to keep the actual value_pwm_1
int ledpin_1 = 3; // light connected to digital pin 3
int array_tag_1 = 0; // where to get first value for phase 1 positive from array, first value in array is tagged at 0

int value_pwm_2 = 0; // variable to keep the actual value_pwm_2
int ledpin_2 = 4; // light connected to digital pin 4
int array_tag_2 = 1; // where to get first value for phase 1 negative from array

int value_pwm_3 = 0; // variable to keep the actual value_pwm_2
int ledpin_3 = 12; // light connected to digital pin 12
int array_tag_3 = 2; // where to get first value for phase 2 positive from array

int value_pwm_4 = 0; // variable to keep the actual value_pwm_2
int ledpin_4 = 13; // light connected to digital pin 13
int array_tag_4 = 3; // where to get first value for phase 2 negative from array

int value_pwm_5 = 0; // variable to keep the actual value_pwm_2
int ledpin_5 = 14; // light connected to digital pin 14
int array_tag_5 = 4; // where to get first value for phase 3 positive from array

int value_pwm_6 = 0; // variable to keep the actual value_pwm_2
int ledpin_6 = 15; // light connected to digital pin 15
int array_tag_6 = 5; // where to get first value for phase 3 negative from array

void setup()
{
pinMode(7, OUTPUT); // using an LED on pin 7 to indicate the completion of one complete cycle on phase 1
}

void loop()
{
pot_value = analogRead(analog_pin) / 100; // using a pot to control the frequency
max_volts = analogRead(analog_volt) / 4; // changes the max voltage based on the second pot

analogWrite(ledpin_1, (sinarray[array_tag_1] * max_volts / 100)); // sets the value_pwm_1 picked from the array
analogWrite(ledpin_2, (sinarray[array_tag_2] * max_volts / 100)); // sets the value_pwm_2 picked from the array
analogWrite(ledpin_3, (sinarray[array_tag_3] * max_volts / 100)); // sets the value_pwm_3
analogWrite(ledpin_4, (sinarray[array_tag_4] * max_volts / 100)); // sets the value_pwm_4
analogWrite(ledpin_5, (sinarray[array_tag_5] * max_volts / 100)); // sets the value_pwm_5
analogWrite(ledpin_6, (sinarray[array_tag_6] * max_volts / 100)); // sets the value_pwm_6

if (array_tag_1 < 1074) { // 1074 is the last the last array tag for phase 1 postive, so below that we add 6 to each tag to get to the next spot for each phase in the array

array_tag_1 = array_tag_1 + 6;
array_tag_2 = array_tag_2 + 6;
array_tag_3 = array_tag_3 + 6;
array_tag_4 = array_tag_4 + 6;
array_tag_5 = array_tag_5 + 6;
array_tag_6 = array_tag_6 + 6;


}

else { // after 1074 we reset all the array tags to their original value

digitalWrite (7,HIGH); // I flash an LED to see the completion of each cycle

array_tag_1 = 0; // this resets the array counters back to zero
array_tag_2 = 1;
array_tag_3 = 2;
array_tag_4 = 3;
array_tag_5 = 4;
array_tag_6 = 5;

}

delay(pot_value); // delays and reruns the whole thing after going through each full cycle. I need to be able to due this without delays and with faster PWM

digitalWrite (7,LOW);




}