Code trouble, Freq gen


hey guys probly easy fix, working @ 1 point, great actually. please if can me fix code, not remake please lol.


so simple freq gen controlled serial monitor, type-> f300 300hz, have set stay @ 50% duty. problem cant go lower 122hz? have set change prescaler bv(cs10) bv(cs12) when bellow 123hz. on scope pin goes high when go bellow 123hz, go 900khz now, go down 2-5hz.

can see im doing wrong here?

code: [select]
float volts = 0;
int time = 0;
int serialdata = 0;
int inbyte;
unsigned long duty =161;// 33500=50% duty
unsigned long freq = 25000;
float num;
float num2;
float freq1;


#include "nanopwmac.h"


void setup() {
  serial.begin(9600);
 serial.println("frequency generator");
 serial.println("freq = 200 ");
 serial.println("duty cycle = 50%");
 nanopwmac(freq,duty);

}

void loop() {
 
 
  delay(1000); // wait second.

  if (inbyte != '/' || 'i' || 's' || 'd' || 'm' || 's' || '<' || '>' || 'f' || 'd')
  {
    inbyte = serial.read();
 
 
    if (inbyte > 0 && inbyte != '/')
    {
      serialdata = serialdata * 10 + inbyte - '0';
     
  }  }
  //enter s time
if(inbyte == 'f'){
  num = serial.parsefloat();
  freq = num;
  freq1 = freq;
  float top = f_cpu / freq1 / 2 + 1;
  duty = (top+2)/2;
  serial.print("duty--->    ");
  serial.println(duty);
  serial.print("freq changed--->    ");
  serial.println(freq);
  nanopwmac(freq,duty);
  serial.println("serial.cleared");
  serialdata = 0;
  inbyte = 0;
  }
  if(inbyte == 'd'){
  num2 = serial.parsefloat();
  duty = duty/50*num2;
  serial.println("duty cycle changed--->");
  serial.print(duty);
  nanopwmac(freq,duty);
  serial.println("serial.cleared");
  serialdata = 0;
  inbyte = 0;
  }}


.cpp
code: [select]
// ---------------------------------------------------------------------------
// based on toneac tim eckel - teckel@leethost.com
// modified richard morrow - http://www.rmcybernetics.com
// copyright 2013 license: gnu gpl v3 http://www.gnu.org/licenses/gpl-3.0.html
//
// see "nanopwmac.h" purpose, syntax, version history, links, , more.
// ---------------------------------------------------------------------------

#include "nanopwmac.h"

// todo: compensate freqeuncy inaccuracy @ high frequencies
// todo: rename pulsewidth etc pulse width etc
// todo: recalibrate pulsewidth duty in ns (e.g. 0.125)

void nanopwmac(unsigned long frequency, unsigned long pulsewidth) {
  if (frequency == 0 || pulsewidth == 0) { nanopwmac_off(); return; }   // if frequency or pulsewidth 0, turn off output , return.
 
  pwmt1dreg |= _bv(pwmt1amask) | _bv(pwmt1bmask); // set timer 1 pwm pins output (because analogwrite too).

  uint8_t prescaler = _bv(cs10);                 // try using prescaler 1 first.
  unsigned long top = f_cpu / frequency / 2 + 1; // calculate top.
  if (top > 65000) {                             // if not in range prescaler 1, use prescaler 256 (122 hz , lower @ 16 mhz).
    prescaler = _bv(cs12);                       // set 256 prescaler bit.
    top = top / 256 - 1;                         // calculate top using prescaler 256.
  }

  unsigned int duty = pulsewidth; // divide 125 because 1 unit of duty = 125ns

  icr1   = top;                         // set top.
  if (tcnt1 > top) tcnt1 = top;         // counter on top, put within range.
  tccr1b = _bv(wgm13)  | prescaler;     // set pwm, phase , frequency corrected (top=icr1) , prescaler.
  ocr1a  = ocr1b = duty;                // set duty cycle (pulsewidth).
  tccr1a = _bv(com1a1) | _bv(com1b1) | _bv(com1b0); // inverted/non-inverted mode (ac).

}

void nanopwmac_off() {
  timsk1 &= ~_bv(ocie1a);     // remove timer interrupt.
  tccr1b  = _bv(cs11);        // default clock prescaler of 8.
  tccr1a  = _bv(wgm10);       // set defaults pwm can work normal (pwm, phase corrected, 8bit).
  pwmt1port &= ~_bv(pwmt1amask); // set timer 1 pwm pins low.
  pwmt1port &= ~_bv(pwmt1bmask); // other timer 1 pwm pin low.
}


header file
code: [select]
// ---------------------------------------------------------------------------
// nanopwmac library - v1.0 - august 2013
//
// author/license:
// based on toneac created tim eckel - teckel@leethost.com
// modified richard morrow - http://www.rmcybernetics.com/
// copyright 2013 license: gnu gpl v3 http://www.gnu.org/licenses/gpl-3.0.html
//
// links:
// toneac project home: http://code.google.com/p/arduino-tone-ac/
// rmcybernetics - http://www.rmcybernetics.com/
//
// disclaimer:
// software furnished "as is", without technical support, , no
// warranty, express or implied, usefulness purpose.
//
// purpose:
// precision pulse generation 125ns resolution
// frequency 1hz 2mhz
//
// usage:
// tell frequency , pulse width in ns want.
// output on 2 pins push/pull typle output
//
// connection:
//   pins  9 & 10 - atmega328, atmega128, atmega640, atmega8, uno, leonardo, etc.
//   pins 11 & 12 - atmega2560/2561, atmega1280/1281, mega
//   pins 12 & 13 - atmega1284p, atmega644
//   pins 14 & 15 - teensy 2.0
//   pins 25 & 26 - teensy++ 2.0
//
// syntax:
//   nanopwmac(frequency, pulsewidth) - starts output
//     parameters:
//       * frequency  - outputs specified frequency indefinitely, turn off nanopwmac_off().
//       * pulsewidth     - set pulsewidth in ns (should multiple of 125ns)
//   nanopwmac_off()  - stop output (both pins go low)
//---------------------------------------------------------------------------

#ifndef nanopwmac_h
  #define nanopwmac_h

  #if defined(arduino) && arduino >= 100
    #include <arduino.h>
  #else
    #include <wprogram.h>
  #endif
 
  #if defined (__avr_atmega32u4__) || defined(__avr_atmega640__) || defined(__avr_atmega1280__) || defined(__avr_atmega1281__) || defined(__avr_atmega2560__) || defined(__avr_atmega2561__)
    #define pwmt1amask ddb5
    #define pwmt1bmask ddb6
    #define pwmt1dreg ddrb
    #define pwmt1port portb
  #elif defined(__avr_atmega1284p__) || defined(__avr_atmega644__) || defined(__avr_atmega644p__)
    #define pwmt1amask ddd4
    #define pwmt1bmask ddd5
    #define pwmt1dreg ddrd
    #define pwmt1port portd
  #else
    #define pwmt1amask ddb1
    #define pwmt1bmask ddb2
    #define pwmt1dreg ddrb
    #define pwmt1port portb
  #endif

  #if defined(__avr_atmega8__) || defined(__avr_atmega128__)
    #define timsk1 timsk
  #endif

 
  void nanopwmac(unsigned long frequency = 0, unsigned long pulsewidth = 125);
  void nanopwmac_off();
#endif

i did figure out ended having 2 variables called top, 1 in code , 1 in cpp file, these creating conflict.



Arduino Forum > Using Arduino > Project Guidance > Code trouble, Freq gen


arduino

Comments

Popular posts from this blog

Flip address is out of range arduino uno r3

Arduino Uno not uploading

Indesign and MathType fonts