0

As the title says, I need 1khz frequency signal with 10-bit resolution. But I am not good with uControllers and complicated programming.

I need a simple code for this task.

I tried using this Interactive PWM from arduinoslovakia.eu but I dont know what the frequency is at 10-bit resolution and how to set frequency in this code.

asked Aug 17, 2019 at 8:08
4
  • Are you talking about a square wave? In what way would it have 10-bit resolution? Either it is 1 kHz or not, yes? Are you talking about an error factor? Like, 1 kHz +/- 5% ? Commented Aug 17, 2019 at 8:33
  • @NickGammon The "10-bit resolution" will refer to the resolution of the duty cycle parameter. i.e., a duty cycle between 0 and 1023 instead of the normal 0 to 255. Commented Aug 17, 2019 at 12:12
  • Perhaps but the rather brief question does not mention duty cycles. Commented Aug 17, 2019 at 12:21
  • @NickGammon No, but it does mention PWM, and PWM has a duty cycle (which is what makes it PWM). Commented Aug 17, 2019 at 14:39

1 Answer 1

2

I see you are talking about using the 16-bit timer, which is Timer 1 on the Uno.

Assuming you are using a Uno this code will do it:

// Clock frequency divided by 1 kHz frequency desired
const long timer1_OCR1A_Setting = F_CPU / 1000;
const byte outputPin = 10; // Timer 1 "B" output: OC1B
void setup() 
 {
 pinMode (outputPin, OUTPUT);
 // set up Timer 1
 // Fast PWM top at OCR1A
 TCCR1A = bit (WGM10) | bit (WGM11) | bit (COM1B1); // fast PWM, clear OC1B on compare
 TCCR1B = bit (WGM12) | bit (WGM13) | bit (CS10); // fast PWM, no prescaler
 OCR1A = timer1_OCR1A_Setting - 1; // zero relative
 OCR1B = (timer1_OCR1A_Setting / 2) - 1; // 50 % duty cycle
 } // end of setup
void loop()
 {
 }

You can change the 1000 in the calculation for timer1_OCR1A_Setting, within reason, to get other frequencies.

See my page about timers for more background information.

answered Aug 17, 2019 at 9:05
3
  • On a 16Mhz Arduino you'd get around 14 bits of resolution, using this code. It is however impossible to get exactly 14-bit (or 10-bit) of resolution without changing the frequency (to around 0.9765kHz). Commented Aug 17, 2019 at 13:32
  • 1
    To explain that comment, OCR1A would be set to 16000 using the above code, and that is log(16000)/log(2) bits, namely 13.97 bits roughly. Therefore your duty cycle (OCR1B) could be in the range 0 to 15999 giving at least 10 bits of resolution. Commented Aug 17, 2019 at 21:21
  • Thanks for the answer. Commented Aug 18, 2019 at 13:18

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.