Hi, i am a beginer. I have read information about timers arduino due and mega, datasheret says that timer one in both is the same, but then i try to run that program, arduino due works corretly but arduino mega dont does pwm output, i changed pwm output from 9 to 11 for arduino mega, but still not have signal.. can anyone help me, is there a program foult, mabe it is librarry foult?
p;rogram code:
#include "TimerOne.h" // using Timer1 library from http://www.arduino.cc/playground/Code/Timer1
#define SOL_AMPS_CHAN 1
#define SOL_VOLTS_CHAN 0
#define BAT_VOLTS_CHAN 2
#define AVG_NUM 8
#define SOL_AMPS_SCALE 12
#define SOL_VOLTS_SCALE 27
#define BAT_VOLTS_SCALE 27
#define PWM_PIN 11
#define PWM_ENABLE_PIN 8
#define PWM_FULL 1023
#define PWM_MAX 100
#define PWM_MIN 60
#define PWM_START 90
#define PWM_INC 1
#define TRUE 1
#define FALSE 0
#define ON TRUE
#define OFF FALSE
#define TURN_ON_MOSFETS digitalWrite(PWM_ENABLE_PIN, HIGH)
#define TURN_OFF_MOSFETS digitalWrite(PWM_ENABLE_PIN, LOW)
#define ONE_SECOND 50000
#define LOW_SOL_WATTS 500
#define MIN_SOL_WATTS 100
#define MIN_BAT_VOLTS 1000
#define MAX_BAT_VOLTS 1410
#define HIGH_BAT_VOLTS 1300
#define OFF_NUM 9
int ledPin = 13;
int ledPin_jc2 = 5;
int ledPin_jc3 = 6;
int digPin = 4;
int count = 0;
int pwm = 0;
int sol_amps;
int sol_volts;
int bat_volts;
int sol_watts;
int old_sol_watts = 0;
unsigned int seconds = 0;
unsigned int prev_seconds = 0;
unsigned int interrupt_counter = 0;
boolean led_on = TRUE;
int led_counter = 0;
int delta = PWM_INC;
enum charger_mode {off, on, bulk, bat_float} charger_state;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPin_jc2, OUTPUT);
pinMode(PWM_ENABLE_PIN, OUTPUT);
pinMode(PWM_PIN, OUTPUT);
Timer1.initialize(20);
Timer1.pwm(PWM_PIN, 0);
TURN_ON_MOSFETS;
Timer1.attachInterrupt(callback);
Serial.begin(9600);
pwm = PWM_START;
charger_state = on;
}
void callback()
{
if (interrupt_counter++ > ONE_SECOND) {
interrupt_counter = 0;
seconds++;
}
}
int read_adc(int channel){
int sum = 0;
int temp;
int i;
for (i=0; i<AVG_NUM; i++) {
temp = analogRead(channel);
sum += temp;
delayMicroseconds(50);
}
return(sum / AVG_NUM);
}
void set_pwm_duty(void) {
if (pwm > PWM_MAX) {
pwm = PWM_MAX;
}
else if (pwm < PWM_MIN) {
pwm = PWM_MIN;
}
if (pwm < PWM_MAX) {
Timer1.pwm(PWM_PIN,(PWM_FULL * (long)pwm / 100), 20); // use Timer1 routine to set pwm duty cycle at 20uS period
//Timer1.pwm(PWM_PIN,(PWM_FULL * (long)pwm / 100));
}
else if (pwm == PWM_MAX) {
Timer1.pwm(PWM_PIN,(PWM_FULL - 1), 1000);
//Timer1.pwm(PWM_PIN,(PWM_FULL - 1));
}
}
void read_data(void) {
sol_amps = ((read_adc(SOL_AMPS_CHAN) * SOL_AMPS_SCALE) + 5) / 10;
sol_volts = ((read_adc(SOL_VOLTS_CHAN) * SOL_VOLTS_SCALE) + 5) / 10;
bat_volts = ((read_adc(BAT_VOLTS_CHAN) * BAT_VOLTS_SCALE) + 5) / 10;
sol_watts = (int)((((long)sol_amps * (long)sol_volts) + 50) / 100);
}
void run_charger(void) {
static int off_count = OFF_NUM;
switch (charger_state) {
case on:
if (sol_watts < MIN_SOL_WATTS) {
charger_state = off;
off_count = OFF_NUM;
TURN_OFF_MOSFETS;
}
else if (bat_volts > MAX_BAT_VOLTS) {
charger_state = bat_float;
}
else if (sol_watts < LOW_SOL_WATTS) {
pwm = PWM_MAX;
set_pwm_duty();
}
else {
pwm = ((bat_volts * 10) / (sol_volts / 10)) + 5;
charger_state = bulk;
}
break;
case bulk:
if (sol_watts < MIN_SOL_WATTS) {
charger_state = off;
off_count = OFF_NUM;
TURN_OFF_MOSFETS;
}
else if (bat_volts > MAX_BAT_VOLTS) {
charger_state = bat_float;
}
else if (sol_watts < LOW_SOL_WATTS) {
charger_state = on;
TURN_ON_MOSFETS;
}
else {
if (old_sol_watts >= sol_watts) {
delta = -delta;
}
pwm += delta;
old_sol_watts = sol_watts;
set_pwm_duty();
}
break;
case bat_float:
if (sol_watts < MIN_SOL_WATTS) {
charger_state = off;
off_count = OFF_NUM;
set_pwm_duty();
TURN_OFF_MOSFETS;
}
else if (bat_volts > MAX_BAT_VOLTS) {
pwm -= 1;
set_pwm_duty();
}
else if (bat_volts < MAX_BAT_VOLTS) {
pwm += 1;
set_pwm_duty();
if (pwm >= 100) {
charger_state = bulk;
}
}
break;
case off:
if (off_count > 0) {
off_count--;
}
else if ((bat_volts > HIGH_BAT_VOLTS) && (bat_volts < MAX_BAT_VOLTS) && (sol_volts > bat_volts)) {
charger_state = bat_float;
set_pwm_duty();
TURN_ON_MOSFETS;
}
else if ((bat_volts > MIN_BAT_VOLTS) && (bat_volts < MAX_BAT_VOLTS) && (sol_volts > bat_volts)) {
pwm = PWM_START;
set_pwm_duty();
charger_state = on;
TURN_ON_MOSFETS;
}
break;
default:
TURN_OFF_MOSFETS;
break;
}
}
void loop()
{
read_data();
run_charger();
}