0

I am using this code to make 10 bit PWM on port number 9, it seems like everything printed is 0,1022 rather than printing 0, 512, 1023. Is there a problem in my code ?

I wired pin9 to A3 to get the output and print it.

  void setup() {
  Serial.begin(9600);
  pinMode(A3,INPUT);
  // Set PB1/2 as outputs.
  DDRB |= (1 << DDB1) | (1 << DDB2);

  TCCR1A =
      (1 << COM1A1) | (1 << COM1B1) |
      // Fast PWM mode.
      (1 << WGM11);
  TCCR1B =
      // Fast PWM mode.
      (1 << WGM12) | (1 << WGM13) |
      // No clock prescaling (fastest possible
      // freq).
      (1 << CS10);
  OCR1A = 0;
  // Set the counter value that corresponds to
  // full duty cycle. For 15-bit PWM use
  // 0x7fff, etc. A lower value for ICR1 will
  // allow a faster PWM frequency.
  ICR1 = 0x03ff;
}

void loop() {
  // Use OCR1A and OCR1B to control the PWM
  // duty cycle. Duty cycle = OCR1A / ICR1.
  // OCR1A controls PWM on pin 9 (PORTB1).
  // OCR1B controls PWM on pin 10 (PORTB2).
  OCR1A = 0x0000;
  delay(500);
  Serial.println(analogRead(A3));
  OCR1A = 0x0200;
  delay(500);
  Serial.println(analogRead(A3));
  OCR1A = 0x03ff;
  delay(500);
  Serial.println(analogRead(A3));
}

The output looks like that:

  0 0 1022 1021 0 1022 1021 0 0 1021 0 1021 1021 0 0 1021 0 0 1022

no data between 0 and 1022 are presented.

thanks.

Mostafa Khattab
  • 281
  • 4
  • 16

1 Answers1

4

On your code, you using analogRead but declaring the pin (A3) as output. Change it to pinMode(A3,INPUT);

Aside from that, PWM is basically a digital output which changing (HIGH and LOW) at specified frequency. When the result you got is

0 0 1022 1021 0 1022 1021 0 0 1021 0 1021 1021 0 0 1021 0 0 1022

There's nothing wrong. 0 --> LOW, and 1021++ --> HIGH
If you want "measure" something from the PWM, use pulseIn() instead, you can check the documentation here.

If you want to measure the PWM value, I suggest you read:
Can I connect a PWM pin on one Arduino to an analog input on another?

duck
  • 1,258
  • 10
  • 27
  • Thanks for your note, I just got output like that, which is wrong I guess. 0 0 1022 1021 0 1022 1021 0 0 1021 0 1021 1021 0 0 1021 0 0 1022 – Mostafa Khattab Nov 22 '16 at 07:30
  • I update my answer – duck Nov 22 '16 at 07:46
  • Thank you, does that allow me to make arduino output analg data like a potentiometer ? – Mostafa Khattab Nov 22 '16 at 08:06
  • Based on @Russell answer from the link above, yes. – duck Nov 22 '16 at 08:08
  • but, why I don't write that code when I use a potentiometer for example ? – Mostafa Khattab Nov 22 '16 at 08:42
  • unless you put capacitor and resistor, (to make the signal "less square"), analogRead will keep returning HIGH and LOW value. While the other way is measure the time difference between pulseIn(3,HIGH) and pulseIn(3,LOW). That way you can get the duty cycle, which mean, calculating the rest is possible. – duck Nov 22 '16 at 08:48