Slowing down rotary encoder using interrupts


hello,

i building dds frequency generator using arduino , ad9835 http://arduino.cc/forum/index.php?topic=67958.0 got spark fun.

i using 3x4 matrix keypad set output frequency , rotary encoder fine tuning..  i have of working except rotary encoder way sensitive.  i using hardware debouncing found here http://arduino.cc/playground/main/rotaryencoders#debounce , works great in decoder increments in single steps.  my problem using interrupts control rotary encoder , using large dial type knob on encoder , find hard make small adjustments it.  when spin @ reasonable pace frequency going fast.  i have never used interrupts in past read there no way put in delay in code.  how go slowing down interrupts reads every 2nd or 3rd pulse encoder?  can done in softwre or need use kind of hardware methord slow down.

i have attached encoder , keypad section of code below.  any or comments appreciated

 
code: [select]
/**
* sinusoid frequency generator.
*
* program produces sinusoidal signal using ad9835 ic
*/

// variables change:
long rotate=10000;
long frequency =0;
int jump = 1;
long num = 0;
//*********************************************************lcd setup start******************************************
#include <softwareserial.h>

#define txpin 5

softwareserial lcd = softwareserial(0, txpin);
// since lcd not send data arduino, should define txpin
const int lcddelay=10;  // conservative, 2 works

//*************************************ad9835 setup*************************************

#include <spi.h>
#include "ad9835.h"

//setup keypad pins\

#include <keypad.h>
const byte rows = 4; //four rows
const byte cols = 3; //three columns
char keys[rows][cols] = {
 {
   '1','2','3'                                                              }
 ,
 {
   '4','5','6'                                                              }
 ,
 {
   '7','8','9'                                                              }
 ,
 {
   '*','0','#'                                                              }
};
byte rowpins[rows] = {
 48, 46, 44, 42}; //connect row pinouts of keypad
byte colpins[cols] = {
 40, 38, 36}; //connect column pinouts of keypad

keypad keypad = keypad( makekeymap(keys), rowpins, colpins, rows, cols );

// begin creating ad9835 object pin assignments
// used.  if pinout used, must be
// modified.

//first must first set of our dds ad9385 output pins.
ad9835 dds(
13, // fsync
9, // sclk
8, // sdata
12, // fsel
11, // psel1arduino serial usb board
10, // psel0
50000000 // hzmasterclockfrequency (50mhz)
);


//***********************************encoder setup start**********************************
#define encoder0pina  2
#define encoder0pinb  4


 //*************************************encoder setup**************************************
 pinmode(encoder0pina, input);
 digitalwrite(encoder0pina, high);       // turn on pullup resistor
 pinmode(encoder0pinb, input);
 digitalwrite(encoder0pinb, high);       // turn on pullup resistor
 attachinterrupt(0, doencoder, change);  // encoder pin on interrupt 0 - pin 2

}//end setup

void loop(){



 while(1)
 {
   inputkeys();
   serialsend();


//*************************************keypad setup***************************************
void inputkeys(){

 char key = keypad.getkey();
 if (key){
   switch (key) {
   case '#':
     frequency = num ;//set frequency number entered
     dds.setfrequencyhz(0, (frequency)); //send new frequency dds ic
     dds.selectfrequencyregister(0);

     // without modulation choice of phase offset not matter,
     // set 0 measure.
     dds.setphasedeg(0,0);
     dds.selectphaseregister(0);
     serial.println("---------------------");
     serial.println("the frequency is");
     serial.print(frequency);
     serial.print(" hz");
     serial.println("");
     serial.println("--------------------");
     num=0;
     clearlcd();
     delay (100);
     break;

   case '*'://clear input
     num=0;
     clearlcd();
     break;

   default:
     key=key-'0'; //convert char integer otherwise out 48
     num =(num*10 + key); //move left 1 decimal place , enter next digit
     //serial.println(num); //print number
     serial.println(num); //print number
     break;
   }//end switch

 }//end if
 delay(10);

}//end keypad subrutine


//************************************rotary encoder**************************************
void doencoder(){


 if (digitalread(encoder0pina) == high) {   // found low-to-high on channel a
   if (digitalread(encoder0pinb) == low) {  // check channel b see way
     // encoder turning


     rotate = rotate;                 // ccw
   }//end  if (digitalread(encoder0pinb) == low)
   else {
     rotate = rotate;                 // cw
   }//end else
 }//end if (digitalread(encoder0pina) == high)
 else                                        // found high-to-low on channel a
 {
   if (digitalread(encoder0pinb) == low) {   // check channel b see way
     // encoder turning  
     rotate = rotate + jump;        // cw
   }//end if

   else {
     rotate = rotate - jump;         // ccw
   }//end else
 }//end else if (digitalread(encoder0pinb) == low

}//end subroutine


void serialsend(){

 //***************************************dds stuff**************************************

 //clearlcd();
 
frequency =  rotate;
 
 // start dds libary
 dds.begin();
 // set board produce signal.
 dds.setfrequencyhz(0, (frequency));
 dds.selectfrequencyregister(0);

 // without modulation choice of phase offset not matter,
 // set 0 measure.
 dds.setphasedeg(0,0);
 dds.selectphaseregister(0);

 // finally, turn on ic.
 dds.enable();


}






quote
how go slowing down interrupts reads every 2nd or 3rd pulse encoder?

interrupts are, definition, high priority events ("if don't read character out of register, it'll overwritten in few hundred microseconds"); don't ever want delay in them, unless know you're doing.
what divide incoming pulses, counting them, , outputting pulse every 3 or 4 interrupts.
don't forget reset counter.


Arduino Forum > Using Arduino > Project Guidance > Slowing down rotary encoder using interrupts


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial