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?
.cpp
header file
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
Post a Comment