//TCCR2=0x64; //phase correct PWM, no prescaller - 15kHz PWM
//configuring timer 0
TCNT0=0x00; //timer set to start value
TCCR0A|=0x04; //timer/counter 0 input frequency divider set to /8 (that is, 1MHz)
TIMSK0|=0x01; //timer/counter 0 interrupt enabled
SREG|=0x80; //global interrupt enabled
speed=10; //2.5 Hz
//OCR1A=128;
//OCR1B=128;
//OCR2=128;
unsigned char led_cntr=0;
while (1)
{
int i;
if ((INPUT_RUN) || (INPUT_JOG))
{
if (led_cntr>16) LED_OFF else LED_ON //we just make short blinks to save power
led_cntr++;
//The VFfactor defines VF curve (how V depends on speed)
//int VFfactor=(int)speed+180; //ปรับแรงบิด ปกติ +18 ไม่เกิน +180 This setting is for asynchronous motor in delta connection (230VAC delta / 400VAC star)
int VFfactor=speed/2+14; //ปรับแรงบิด ปกติ 4/+15 this settign is for 200VAC servo motor with permanent magnet
if (VFfactor>255) VFfactor=255;
//computing PWM ratios (as we have nothing else to do, this is not optimized)
for (i=0;i<64;i++)
{
int A=sin_table[i];
if (A>127) A=-256+A; //wow! how come I cannot cast char to int?
A=A*VFfactor;
A=A/256;
A+=128+6;
if (A>250) A=250; //because signal delay, we cannot actually create very short impulses
//This is the timebase REFCLOCK for the DDS generator
//FOUT = (M (REFCLK)) / (2 exp 32)
//Runtime : 8 microseconds
ISR(TIMER2_OVF_vect)
{
cbi(PORTD,program_exec_time); //Clear the pin
sbi(PORTD,ISR_exec_time); // Sets the pin
phase_accumulator=phase_accumulator+tword_m; //Adds tuning M word to previoud phase accumulator. refer to DDS_calculator (from Martin Nawrath) for explination.
current_count=phase_accumulator >> 24; // use upper 8 bits of phase_accumulator as frequency information
//motor 1
OCR3B = pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR3C = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1
OCR0B = pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
//motor 2
OCR3A = OCR3B; //OCR0A;//pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR4A = OCR3C;//OCR0B;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1
OCR4B = OCR0B;//OCR1A;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
//motor 3
OCR4C = OCR3B; //OCR0A;//pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR2B = OCR3C;//OCR0B;///pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1
OCR2A = OCR0B;//OCR1A;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
//motor 4
OCR1A = OCR3B; //OCR0A;//OCR2A;//pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR1B = OCR3C;//OCR0B;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1
OCR0A = OCR0B;//OCR1A;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
//motor 5
OCR5A = OCR3B; //OCR0A;//pgm_read_byte_near(sine256 + current_count); // read value fron ROM sine table and send to PWM
OCR5B = OCR3C;//OCR0B;///pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_1)); // read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM1
OCR5C = OCR0B;//OCR1A;//pgm_read_byte_near(sine256 + (uint8_t)(current_count + offset_2));// read value fron ROM sine table and send to PWM, 120 Degree out of phase of PWM2
//increment variable ms4_delay every 4mS/125 = milliseconds 32uS
Heutzutage gibt es für die verschiedensten Teilgebiete der Elektrotechnik bereits eine Vielzahl vorkonfigurierter, modularer und kostengünstiger Entwicklungsumgebungen, dank deren Verfügbarkeit ein Testsystem bzw. ein Prototyp für die unterschiedlichsten Anwendungen meist relativ schnell realisiert werden kann. Hierzu zählen beispielsweise Entwicklungsumgebungen aus folgenden Bereichen:
Mikrocontroller ( STM, Microchip, Atmel, … )
FPGAs und DSPs ( Altera, Xilinx, TI, Analog Devices, … )
Mess- und Sensortechnik ( Analog Devices, Linear Technology, … )
Zielsetzung
Ziel dieses Projektes ist der Entwurf sowie die Fertigung einer möglichst universellen 3-Phasenbrücke. Im Vordergrund dieser Entwicklung sollen hierbei ein robustes Design, wie auch flexible Ansteuermöglichkeiten der Brücke stehen.
Stromsensoren
Zur Realisierung einer galvanisch getrennten Strommessung aller 3 Phasen wurden die Strom-Messwandler ACS770 (Allegro Micro Systems) ausgewahlt. Diese Sensoren basieren auf dem Halleffekt und sind pinkompatibel in den Messbereichen ± 50A, ± 100A, ± 150A und ± 200A verfügbar. Die Wandler werden über 5V versorgt und stellen eine stromproportionale Spannung am Ausgang zur Verfügung.
A/D-Wandler
Die von den Strom-Messwandlern gemessenen Phasenströme sollen von der Brücke digital an das zur Ansteuerung verwendete Zielsystem übertragen werden. Das Zielsystem kann diese Messwerte dann verwenden, um beispielsweise einen Stromregler (z.B. für feldorientierte Vektorregelung), eine Nulldurchgangserkennung (z.B. fur geberlose Ansteuerung) oder eine Überstromabschaltung zu implementieren. Hierfür ist es notwendig, min. zwei Phasenströme zeitgleich zu samplen. Der A/D-Wandler AD7866 (Analog Devices) ist für diese Aufgabe ideal geeignet: