How do I change the polarity of the PWM output, WGM mode 5, OCR1A on the fly?

I use WGM mode 5 to provide PWM to drive gearhead motors. I update the OCR values every 50 msec. The algorithm makes changes gradually.

If, for example, the motor is CCW at 50%, the OCR value is 128. The register values for this are:
(1)
  TCCR1A = _BV(COM1A1) | _BV(WGM10);
  TCCR1B = _BV(WGM12) | _BV(CS11);
  OCR1A = 80;

I want to reverse the direction of the motor.  The register values are:
(2)
  TCCR1A = _BV(COM1A1) | _BV(COM1A0) |_BV(WGM10);
  TCCR1B = _BV(WGM12) | _BV(CS11);
  OCR1A = 80;

The algorithm will slow the motor to stop and then reverse it. I tried setting OCR1A = 0, changing the TCCR1 values, and setting OCR1A = 80. This does not work. After changing from (1) to (2), the PWM stops.

What am I doing wrong?  Any ideas?

Tom Dean
#include <avr/io.h>  /* ports and registers */
#include <trace.h>

void motor_init(void);
void both_motor_fwd(void);
void both_motor_rev(void);
void initialize(void);

void initialize() {
  TRACE_PORT_DDR = ALL_OUT;
  TRACE_PORT = 0;
}

void both_motor_fwd() {
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
  TCCR1B = _BV(WGM12) | _BV(CS11);
  TIFR |= _BV(TOV1);
  OCR1A = 80;
  OCR1B = 160;
}

void both_motor_rev() {
  TCCR1A = _BV(COM1A1) | _BV(COM1A0) | _BV(COM1B1) | _BV(COM1B0);
  TCCR1B = _BV(WGM12) | _BV(CS11);
  TIFR |= _BV(TOV1);
  OCR1A = 80;
  OCR1B = 160;
}

void motor_init() {
  DDRB |= _BV(PB6) | _BV(PB5);
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
  TCCR1B = _BV(WGM12) | _BV(CS11);
  OCR1A = 80;
  OCR1B = 160;
}

int main() {
  initialize();
  motor_init();
  
  TIFR |= _BV(TOV1);
  while (1) {
	TRACE_ON(0);
	while ((TIFR & _BV(TOV1)) == 0) ;
	TIFR |= _BV(TOV1);
	//both_motor_rev();
	TRACE_ON(1);
	while ((TIFR & _BV(TOV1)) == 0) ;
	TIFR |= _BV(TOV1);
	TRACE_OFF(1);
	TRACE_OFF(0);
	//both_motor_fwd();
  }

  return 0;
}
_______________________________________________
AVR-GCC-list mailing list
AVR-GCC-list@nongnu.org
https://lists.nongnu.org/mailman/listinfo/avr-gcc-list

Reply via email to