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