Go Down

Topic: about the frequency of pro micro (Read 915 times) previous topic - next topic

laoadam

I searched there are some topics talk about the frequency of arduino, I still need help on how to test pro micro's PWM frequency, and how to set it more than 10k.
Thanks.

CrossRoads

Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

laoadam

Thank you CrossRoads, do you know how to measure the PWM  frequency of the pro micro by an arduino oscilloscope?

Paul__B

Thank you CrossRoads, do you know how to measure the PWM  frequency of the pro micro by an Arduino oscilloscope?
Given that you make the correct calculations in your code, why would you want to do that!

laoadam

I bought a motor driver that need be controlled by PWM of above 10K frequency。
Code: [Select]
#include <VirtualWire.h>

//motor A connected between A01 and A02
//motor B connected between B01 and B02

int STBY = 10; //standby


//Motor A
int PWMA = 3; //Speed control
int AIN1 = 9; //Direction
int AIN2 = 8; //Direction

//Motor B
int PWMB = 5; //Speed control
int BIN1 = 6; //Direction
int BIN2 = 16; //Direction

const boolean FORWARD = HIGH;
const boolean REVERSE = LOW;
float speed_Max = 255; //pwm usually goes from 0-255
float speed_Min = 0;
float analogInput_Max = 1023;
float analogInput_Min = 0;
float analogInput_Middle_X = 515;//ideally it would be analogInput_Max / 2
float analogInput_Middle_Y = 495;//ideally it would be analogInput_Max / 2
float deadBand = 0;
float middleMax = (analogInput_Max / 2) + deadBand;
float middleMin = (analogInput_Max / 2) - deadBand;
boolean pastDirection = FORWARD;

void setup(){

Serial.begin( 9600 );

pinMode(STBY, OUTPUT);

pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);

pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);

//receiver setup
vw_set_rx_pin(2);          //Sets pin 12 as the RX Pin
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(2000);            // Bits per sec
vw_rx_start();             // Start the receiver PLL running
}

void loop(){

uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
int i;
    int column = 0;
    String message;
    int commands[30];
   
        // Message with a good checksum received, dump it.
        for (i = 0; i < buflen; i++)
        {     
        //DEBUG:
        //Serial.print(char(buf[i]));
       
        if(char(buf[i]) == '|'){
        commands[column] = message.toInt();
        message = "";
        column++;
        }else{
        message += char(buf[i]);
        }
        }
        //one more time to capture the last value since the message does not end with |
        commands[column] = message.toInt();
       
        // DEBUG
// Serial.print("X: ");
// Serial.print(commands[0]);
// Serial.print(" Y: ");
// Serial.println(commands[1]);

motorControl(commands[0], commands[1]);

}

}

void move(int motor, int speed, boolean direction){
digitalWrite(STBY, HIGH); //disable standby

if(motor == 1){
digitalWrite(AIN1, direction);
digitalWrite(AIN2, !direction);
analogWrite(PWMA, speed);
}else{
digitalWrite(BIN1, !direction);
digitalWrite(BIN2, direction);
analogWrite(PWMB, speed);
}
}

void motorControl(float x, float y) {
boolean currentDirection = y >= analogInput_Middle_Y;

//map(value, fromLow, fromHigh, toLow, toHigh);
if(currentDirection == REVERSE){
y = map(y, analogInput_Middle_Y, analogInput_Min, speed_Min, speed_Max) ; 
}else{
y = map(y, analogInput_Middle_Y, analogInput_Max, speed_Min, speed_Max);
}
 
int subtractFromLeft = map(x, analogInput_Middle_X, analogInput_Min, speed_Min, y);
int subtractFromRight = map(x, analogInput_Middle_X, analogInput_Max, speed_Min, y);

if(subtractFromRight < 0){
subtractFromRight = 0;
}

if(subtractFromLeft < 0){
subtractFromLeft = 0;
}

int Throttle_RIGHT = y - subtractFromRight;
int Throttle_LEFT = y - subtractFromLeft;

boolean currentDirection_LEFT = currentDirection;
boolean currentDirection_RIGHT = currentDirection;


if(Throttle_LEFT < 1 && Throttle_RIGHT > 1){
currentDirection_LEFT = !currentDirection;
Throttle_LEFT = Throttle_RIGHT;
}

if(Throttle_RIGHT < 1 && Throttle_LEFT > 1){
currentDirection_RIGHT = !currentDirection;
Throttle_RIGHT = Throttle_LEFT;
}

move(1, Throttle_LEFT, currentDirection_LEFT);
move(2, Throttle_RIGHT, currentDirection_RIGHT);

// Serial.print("Throttle_LEFT: ");
// Serial.print(Throttle_LEFT);
// Serial.print(" Throttle_RIGHT: ");
// Serial.print(Throttle_RIGHT);
// Serial.println("");
//
// if(Throttle_LEFT >= -400 && Throttle_LEFT <= 400){
// motors.setM1Speed( Throttle_LEFT );
// }
//
// if(Throttle_RIGHT >= -400 && Throttle_RIGHT <= 400){
// motors.setM2Speed( Throttle_RIGHT );
// }
// delay(2);
 
}

Go Up