1

I tried code to obtain 100KHZ PWM output with a 41.66% duty cycle by reading an analog value from A0, which is compared with a reference 5V value for obtaining PWM value.

Can someone help me with the code? Any help is very much appreciated.

Here is my code.

int Pwmpin=9;//Pwm Output Pin
int Fchange= A0;//Frequency change through Potentiometer
void setup() {
 pinMode(Pwmpin, OUTPUT);//Pwm pin as Output
 Serial.begin(9600);
 TCCR1A=_BV(COM1A1)|_BV(COM1B1);//Non-inverted Mode
 TCCR1B=_BV(WGM13)|_BV(CS11);//Prescalar 8
}
void loop(){
 float freq=0;
 float count=10000,countt=0,Pinput=0;
 while(1){
 ICR1=count;//variable Frequency
 countt=16*count;
 freq= int(16000000/countt);
 OCR1A=int(count/2);
 Serial.print("Pwm Freq =");
 Serial.println(freq);
 count=10000;
 Pinput=analogRead(A0);//Read input value
 Serial.print("adc value is:");
 Serial.println(Pinput);
 Pinput=(Pinput/0.0113);
 Serial.print("pwm value is:");
 Serial.println(Pinput);
 count=count+Pinput;
 if(count>=100000) {
 count=10000;
 }
 delay(1000);
 }
}
dda
1,5951 gold badge12 silver badges17 bronze badges
asked Jul 10, 2017 at 13:20
4
  • And the question is? Commented Jul 10, 2017 at 13:36
  • It is difficult to help when we do not how the ADC value should relate to the PWM output. However, keep in mind that ADC conversions are normally noisy and likely should employ techniques to reduce the noise. Also, you might want to look at the micro processor's specifications for the specific processor on your specific Arduino (there are many different types). The PWM values you stated may not be obtainable due to the granularity of the processor's PWM hardware. Commented Jul 10, 2017 at 14:15
  • You could get 41.6̅% duty cycle with a 12 MHz Arduino (do these even exist?). The closest you can get with a 16 MHz Arduino is 41.875%. Commented Jul 10, 2017 at 14:46
  • You appear to be trying to model an analog PWM generator circuit with an MCU - this is probably a bad idea, and would need a higher performance ADC at least. If it all possible, simply using the internal timer to generate PWM digitally would be best. Commented Jul 10, 2017 at 15:36

1 Answer 1

-1
  1. Read the datasheet.
  2. Figure out which pen mode works for you and which prescaler and top you need.
  3. Set timer1 to that mode.

After that all you need is to load the duty cycle register with the desired value.

For your application leave the top value alone.

Your code is far from that.

answered Jul 10, 2017 at 15:14

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.