From ccb57fb5a6e739f494aff2268aa2e89eee09ac4e Mon Sep 17 00:00:00 2001 From: Pontus Giselsson <pontus.giselsson@control.lth.se> Date: Fri, 16 Jan 2009 13:19:54 +0000 Subject: [PATCH] P-Current control sampling rate 0.5ms --- linear_pendulum_2009/avr/Makefile | 81 +++++++ linear_pendulum_2009/avr/compile.sh | 1 + linear_pendulum_2009/avr/compileUpload.sh | 3 + linear_pendulum_2009/avr/current_control | Bin 0 -> 9102 bytes linear_pendulum_2009/avr/current_control.c | 247 +++++++++++++++++++++ 5 files changed, 332 insertions(+) create mode 100644 linear_pendulum_2009/avr/Makefile create mode 100755 linear_pendulum_2009/avr/compile.sh create mode 100755 linear_pendulum_2009/avr/compileUpload.sh create mode 100755 linear_pendulum_2009/avr/current_control create mode 100644 linear_pendulum_2009/avr/current_control.c diff --git a/linear_pendulum_2009/avr/Makefile b/linear_pendulum_2009/avr/Makefile new file mode 100644 index 0000000..91fe37a --- /dev/null +++ b/linear_pendulum_2009/avr/Makefile @@ -0,0 +1,81 @@ +PROJECT=current_control +CHIP=atmega16 + +ARCH=avr +AVRSOURCE= +AVRAUTO=compiled/$(ARCH)/ +AVRARCH=compiled/$(ARCH)/ +LIB_TARGET=$(AVRARCH)lib$(TARGET).a + +CC=$(ARCH)-gcc +CXX=$(ARCH)-gcc +CCFLAGS=-mmcu=$(CHIP) -O5 -I. -I$(AVRAUTO) +AS=$(ARCH)-as +ASFLAGS=-mmcu=$(CHIP) +AR=$(ARCH)-ar +LD=$(ARCH)-ld +OBJDUMP=$(ARCH)-objdump +LDFLAGS= -T $(CHIP).link + +all: $(AVRARCH)$(PROJECT) + +$(LIB_TARGET)(%.o): $(AVRSOURCE)%.c Makefile + $(CC) $(CCFLAGS) -c -o $(AVRARCH)$(%) -I$(AVRSOURCE) -I$(AVRAUTO) $(<) + $(AR) r $(@) $(AVRARCH)$(%) + rm $(AVRARCH)$(%) + +$(LIB_TARGET)(%.o): $(AVRSOURCE)%.cc Makefile + $(CXX) $(CCFLAGS) -c -o $(AVRARCH)$(%) -I$(AVRSOURCE) -I$(AVRAUTO) $(<) + $(AR) r $(@) $(AVRARCH)$(%) + rm $(AVRARCH)$(%) + +$(LIB_TARGET)(%.o): $(AVRSOURCE)%.s Makefile + $(AS) $(ASFLAGS) -o $(AVRARCH)$(%) $(AVRSOURCE)$(*).s + $(AR) r $(@) $(AVRARCH)$(%) + rm $(AVRARCH)$(%) + +$(AVRARCH)%.o: $(AVRSOURCE)%.s Makefile + $(AS) $(ASFLAGS) -o $@ $(AVRSOURCE)$(*).s + +$(AVRARCH)%.o: $(AVRSOURCE)%.c Makefile + $(CC) $(CCFLAGS) -c -o $@ -I. -I$(AVRAUTO) $< + + +$(AVRARCH)%: $(AVRARCH)%.o Makefile + $(CC) $(CCFLAGS) -o $@ $< -lm + +$(AVRARCH)%.sr: all $(AVRARCH)% + avr-objcopy -O srec $(AVRARCH)/$(*) $@ + +%.sr: $(AVRARCH)%.sr + @/bin/true + +%.load: compiled/avr/%.sr +# /work/andersb/atmel/uisp/uisp-0.2b/src/uisp \ +# -dno-poll -dstk200 --erase --upload if=$(AVRARCH)/$(*).sr + uisp \ + -dprog=stk200 \ + --erase \ + --upload if=compiled/avr/$*.sr + +%.load.stk500: compiled/avr/%.sr + uisp \ + -dprog=stk500 \ + --erase \ + --upload if=compiled/avr/$*.sr + +%.dump: all $(AVRARCH)/% + $(OBJDUMP) -D $(AVRARCH)/$(*) + +$(AVRARCH)fuse.sr: fuse.s + avr-gcc -o $(AVRARCH)fuse.o -c fuse.s + avr-objcopy -O srec $(AVRARCH)fuse.o $(AVRARCH)fuse.sr + +fuse.load: $(AVRARCH)fuse.sr + uisp \ + -dprog=stk200 \ + --erase \ + --segment=fuse \ + --upload if=compiled/avr/fuse.sr + +load.stk500: $(PROJECT).load.stk500 \ No newline at end of file diff --git a/linear_pendulum_2009/avr/compile.sh b/linear_pendulum_2009/avr/compile.sh new file mode 100755 index 0000000..2fdb97c --- /dev/null +++ b/linear_pendulum_2009/avr/compile.sh @@ -0,0 +1 @@ +avr-gcc -mmcu=atmega16 -g -Wall -o current_control current_control.c \ No newline at end of file diff --git a/linear_pendulum_2009/avr/compileUpload.sh b/linear_pendulum_2009/avr/compileUpload.sh new file mode 100755 index 0000000..e97cfdf --- /dev/null +++ b/linear_pendulum_2009/avr/compileUpload.sh @@ -0,0 +1,3 @@ +avr-gcc -mmcu=atmega16 -g -Wall -o current_control current_control.c +avr-objcopy -Osrec current_control current_control.sr +uisp -dprog=stk200 --erase --upload if=current_control.sr \ No newline at end of file diff --git a/linear_pendulum_2009/avr/current_control b/linear_pendulum_2009/avr/current_control new file mode 100755 index 0000000000000000000000000000000000000000..1236802cc738412d44badbf6f24556b10cfd4b38 GIT binary patch literal 9102 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 literal 0 HcmV?d00001 diff --git a/linear_pendulum_2009/avr/current_control.c b/linear_pendulum_2009/avr/current_control.c new file mode 100644 index 0000000..70205f1 --- /dev/null +++ b/linear_pendulum_2009/avr/current_control.c @@ -0,0 +1,247 @@ +/********************************************* + + Current regulation - Aleks Ponjavic 18/09/07 + for LTH - reglerteknik + + Note that the voltage is actually a duty + cycle for the PWM. The PWM is running at + 12V with a duty cycle set by a 10bit value + +*********************************************/ + +//#include <math.h> //Only include if sin will be used, takes up memory! +#include <avr/io.h> +#include <avr/signal.h> +#include <avr/interrupt.h> +#include <inttypes.h> + +volatile int16_t ref = 20; +volatile int16_t refCount = 0; +volatile int8_t refFlag = 0; +volatile uint8_t alt = 1; + + +/* Routine used to set the red LED */ +void setLED(uint8_t on) +{ + if (on) PORTB &= 0x7f; //Turn on + else PORTB |= 0x80; //Turn off +} + +/* Routine used to set pin PD7 */ +void setPA4(uint8_t on) +{ + if (on == 0) PORTA &= 0xef; //Turn off + else PORTA |= 0x10; //Turn on +} + +/* Routine used to transmit bytes on the serial port */ +static void putchar(unsigned char ch) +{ + while ((inp(UCSRA) & 0x20) == 0) {}; + outp(ch, UDR); + while ((inp(UCSRA) & 0x20) == 0) {}; +} + +/* Interrupt service routine for handling incoming bytes on the serial port + might be needed to catch incoming bytes */ +SIGNAL(SIG_UART_RECV){} +/* Read 10-bit input using the AD converter */ +static inline int16_t readInput() { + uint8_t low, high; + ADCSRA |= 0x40; + while (ADCSRA & 0x40); + low = ADCL; + high = ADCH; + return ((high<<8) | low) - 512; +} + + +/* Write 8-bit output using the PWM-generator */ +static inline void writeOutput(int16_t val) { + if (val < 0) { + PORTC = 0x80+(PORTC & 0x7F); + OCR1BH = 0; //(unsigned char) (-val)&0xff00; + OCR1BL = (unsigned char) (-val)&0x00ff; + } else { + PORTC = (PORTC & 0x7F); + OCR1BH = 0; //(unsigned char) (val&0xff00); + OCR1BL = (unsigned char) (val&0x00ff); + } + + //unsigned char lbyte,hbyte; + //hbyte = ((val & 0xff00)>>8); //Get ADC result high byte + //lbyte = ((val & 0x00ff)); //Get ADC result low byte + + //putchar(hbyte); + //putchar(lbyte); +} + + +/* Periodic timer interrupt */ +SIGNAL(SIG_OUTPUT_COMPARE2) +{ + + + // PORTA &= 0xef; + unsigned char lbyte,hbyte; + int16_t result; + int16_t ctrl; + int16_t ctrl_out; + int16_t temp; + + setPA4(alt); + + result = readInput(); + + setPA4(0); + + result = result*3; //!!!!!!!!!!!!!!!!!!!!!!! + + // Compensate for offset in measurements + // result += 13; + + //hbyte = (((ref-result) & 0xff00)>>8); //Get ADC result high byte + //lbyte = (((ref-result) & 0x00ff)); //Get ADC result low byte + + // Transmit data + //putchar(hbyte); //high byte + //putchar(lbyte); //low byte + + //hbyte = ((result & 0xff00)>>8); //Get ADC result high byte + //lbyte = ((result & 0x00ff)); //Get ADC result low byte + + // Transmit data + //putchar(hbyte); //high byte + //putchar(lbyte); //low byte + + // control + ctrl = ref-result; + ctrl = ((ctrl + (1<< 2)) >> 3); + + //saturation/rounding to 8 bit + if (ctrl > 127) + ctrl_out = 127; + else if (ctrl < -128) + ctrl_out = -128; + else + ctrl_out = ctrl; + + //writeOutput(ctrl_out); + writeOutput(ref); + + + + temp = (int16_t) ctrl_out; + hbyte = ((temp & 0xff00)>>8); //Get ADC result high byte + lbyte = ((temp & 0x00ff)); //Get ADC result low byte + putchar(hbyte); + putchar(lbyte); + +} + + +/* reference square- or triangle wave generator with timer 0 */ +SIGNAL(SIG_OVERFLOW0) { + int8_t rectangle = 1; + refCount++; + if (rectangle == 1) { + if (refFlag == 0) { + if (refCount == 10) { + refFlag = 1; + ref = -ref; + refCount = 0; + } + } else { + if (refCount == 20) { + ref = -ref; + refCount = 0; + } + } + } else { + if (refCount <= 400) { // ref*2 + ref -= 1; + } else { + ref += 1; + } + if (refCount == 800) { // ref*4 + refCount = 0; + } + } +} + + +int main() +{ + int i,j; + + //Port directions + outp(0x80,PORTB); // LED off + outp(0x80,DDRB); // output on LED + outp(0x08,PORTC); // pull up on overtemp signals + outp(0xa0,DDRC); // output on dir and brake + outp(0x80,PORTD); // pull up on reset switch + outp(0x10,DDRD); // output on pwm for motor 1 + + outp(0x10,DDRA); // test pin output + + /* Timer section */ + // Enable TCNT2 (timer2) compare match interrupts, and timer0 overflow interrupts + outp(BV(OCIE2)|BV(TOIE0),TIMSK); + + /* Timer 1, 8 bit fast PWM no prescaling -> h_pwm=17.35 micros */ + outp(BV(COM1A1)|BV(COM1B1)|BV(WGM10),TCCR1A); + // Fast PWM + // outp(BV(WGM12)|BV(CS10),TCCR1B); + // Phase and frequency correct pwm + outp(BV(CS10),TCCR1B); + /* Reset Timer1*/ + + //outp(0x00,TCNT1H); // Reset TCNT1 high + //outp(0x00,TCNT1L); // Reset TCNT1 low + + + + /* Timer 2 (control loop), prescaler 256, clear on compare match (28), -> h = 0.5 ms */ + outp(BV(WGM21)|BV(CS22)|BV(CS21),TCCR2); + outp(28,OCR2); + /* Reset timer 2 */ + outp(0,TCNT2); + + /* Timer 0 for reference generation, prescaler = 1024 periodic h = ? */ + outp(BV(CS02)|BV(CS00),TCCR0); + + //Serial communication + outp(0x00, UCSRA); // USART: + outp(0x98, UCSRB); // USART: RxIntEnable|RxEnable|TxEnable + outp(0x86, UCSRC); // USART: 8bit, no parity + outp(0x00, UBRRH); // USART: 115200 @ 14.7456MHz + outp(7,UBRRL); // USART: 115200 @ 14.7456MHz + + + /* AREF (AREF is 5V) pin external capacitor, MUX0 for current, MUX3?? for pendulum angle */ + outp(BV(REFS0)|BV(MUX0),ADMUX); + + // Enable ADC interrupts, start first conversion (what do adps0-2 do), prescaler 128 + // outp(BV(ADEN)|BV(ADSC)|BV(ADPS2)|BV(ADPS1)|BV(ADPS0),ADCSRA); + // Enable ADC interrupts, start first conversion (what do adps0-2 do), prescaler 8 + // outp(BV(ADEN)|BV(ADSC)|BV(ADPS1)|BV(ADPS0),ADCSRA); + + // Enable ADC interrupts, start first conversion (what do adps0-2 do), prescaler 64 + outp(BV(ADEN)|BV(ADSC)|BV(ADPS2)|BV(ADPS1),ADCSRA); + + // outp(BV(ADEN)|BV(ADSC),ADCSRA); + + /* Wait a little bit, probably not needed...*/ + int tmp; + for(i=0;i<2000;i++) + for(j=0;j<400;j++) + tmp = j*j*j; + + + //Enable interrupts + sei(); + + // loop + while (1) {} +} -- GitLab