123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723 |
- #include <Arduino.h>
- #include "L6470.h"
- #include <SPI.h>
- #define ENABLE_RESET_PIN 0
- #define K_VALUE 100
- L6470::L6470(int SSPin){
- _SSPin = SSPin;
-
- }
- void L6470::init(int k_value){
-
-
-
-
- pinMode(SLAVE_SELECT_PIN, OUTPUT);
-
-
-
-
- pinMode(_SSPin, OUTPUT);
- digitalWrite(_SSPin, HIGH);
- pinMode(MOSI, OUTPUT);
- pinMode(MISO, INPUT);
- pinMode(SCK, OUTPUT);
- pinMode(BUSYN, INPUT);
- #if (ENABLE_RESET_PIN == 1)
- pinMode(RESET, OUTPUT);
-
-
- digitalWrite(RESET, HIGH);
- delay(10);
- digitalWrite(RESET, LOW);
- delay(10);
- digitalWrite(RESET, HIGH);
- delay(10);
- #endif
-
-
-
-
-
-
- SPI.begin();
- SPI.setBitOrder(MSBFIRST);
- SPI.setClockDivider(SPI_CLOCK_DIV16);
- SPI.setDataMode(SPI_MODE3);
-
-
-
- if (GetParam(CONFIG) == 0x2E88){
-
- }
- else{
-
- }
- #if (ENABLE_RESET_PIN == 0)
- resetDev();
- #endif
-
-
-
-
-
-
-
-
-
-
-
- SetParam(KVAL_RUN, k_value);
- SetParam(KVAL_ACC, k_value);
- SetParam(KVAL_DEC, k_value);
- SetParam(KVAL_HOLD, k_value);
-
-
-
-
-
-
-
-
-
- SetParam(CONFIG, CONFIG_PWM_DIV_1 | CONFIG_PWM_MUL_2 | CONFIG_SR_290V_us| CONFIG_OC_SD_DISABLE | CONFIG_VS_COMP_DISABLE | CONFIG_SW_HARD_STOP | CONFIG_INT_16MHZ);
-
-
-
-
-
-
-
-
-
-
- getStatus();
-
- hardStop();
- }
- boolean L6470::isBusy(){
- int status = getStatus();
- return !((status >> 1) & 0b1);
- }
- void L6470::setMicroSteps(int microSteps){
- byte stepVal = 0;
-
- for(stepVal = 0; stepVal < 8; stepVal++){
- if(microSteps == 1) break;
- microSteps = microSteps >> 1;
- }
- SetParam(STEP_MODE, !SYNC_EN | stepVal | SYNC_SEL_1);
- }
- void L6470::setThresholdSpeed(float thresholdSpeed){
-
-
-
-
-
- if(thresholdSpeed == 0.0){
- SetParam(FS_SPD, 0x3FF);
- }
- else{
- SetParam(FS_SPD, FSCalc(thresholdSpeed));
- }
- }
- void L6470::setCurrent(int current){}
- void L6470::setMaxSpeed(int speed){
-
-
-
-
-
-
- SetParam(MAX_SPEED, MaxSpdCalc(speed));
- }
- void L6470::setMinSpeed(int speed){
-
-
-
-
-
-
- SetParam(MIN_SPEED, MinSpdCalc(speed));
- }
- void L6470::setAcc(float acceleration){
-
-
-
-
-
-
- unsigned long accelerationBYTES = AccCalc(acceleration);
- SetParam(ACC, accelerationBYTES);
- }
- void L6470::setDec(float deceleration){
- unsigned long decelerationBYTES = DecCalc(deceleration);
- SetParam(DEC, decelerationBYTES);
- }
- long L6470::getPos(){
- unsigned long position = GetParam(ABS_POS);
- return convert(position);
- }
- float L6470::getSpeed(){
-
-
- return (float) GetParam(SPEED);
-
-
- }
- void L6470::setOverCurrent(unsigned int ma_current){
-
- byte OCValue = floor(ma_current / 375);
- if(OCValue > 0x0F)OCValue = 0x0F;
- SetParam(OCD_TH, OCValue);
- }
- void L6470::setStallCurrent(float ma_current){
- byte STHValue = (byte)floor(ma_current / 31.25);
- if(STHValue > 0x80)STHValue = 0x80;
- if(STHValue < 0)STHValue = 0;
- SetParam(STALL_TH, STHValue);
- }
- void L6470::SetLowSpeedOpt(boolean enable){
-
-
-
-
-
- Xfer(SET_PARAM | MIN_SPEED);
- if (enable) Param(0x1000, 13);
- else Param(0, 13);
- }
- void L6470::run(byte dir, float spd){
-
-
-
-
-
-
- unsigned long speedVal = SpdCalc(spd);
-
- Xfer(RUN | dir);
- if (speedVal > 0xFFFFF) speedVal = 0xFFFFF;
- Xfer((byte)(speedVal >> 16));
- Xfer((byte)(speedVal >> 8));
- Xfer((byte)(speedVal));
- }
- void L6470::Step_Clock(byte dir){
-
-
-
-
-
- Xfer(STEP_CLOCK | dir);
- }
- void L6470::move(long n_step){
-
-
-
-
-
- byte dir;
-
- if(n_step >= 0){
- dir = FWD;
- }
- else{
- dir = REV;
- }
- long n_stepABS = abs(n_step);
-
- Xfer(MOVE | dir);
- if (n_stepABS > 0x3FFFFF) n_step = 0x3FFFFF;
- Xfer((byte)(n_stepABS >> 16));
- Xfer((byte)(n_stepABS >> 8));
- Xfer((byte)(n_stepABS));
- }
- void L6470::goTo(long pos){
-
-
-
-
- Xfer(GOTO);
- if (pos > 0x3FFFFF) pos = 0x3FFFFF;
- Xfer((byte)(pos >> 16));
- Xfer((byte)(pos >> 8));
- Xfer((byte)(pos));
- }
- void L6470::goTo_DIR(byte dir, long pos){
-
-
- Xfer(GOTO_DIR);
- if (pos > 0x3FFFFF) pos = 0x3FFFFF;
- Xfer((byte)(pos >> 16));
- Xfer((byte)(pos >> 8));
- Xfer((byte)(pos));
- }
- void L6470::goUntil(byte act, byte dir, unsigned long spd){
-
-
-
-
-
-
- Xfer(GO_UNTIL | act | dir);
- if (spd > 0x3FFFFF) spd = 0x3FFFFF;
- Xfer((byte)(spd >> 16));
- Xfer((byte)(spd >> 8));
- Xfer((byte)(spd));
- }
- void L6470::releaseSW(byte act, byte dir){
-
-
-
-
-
-
-
- Xfer(RELEASE_SW | act | dir);
- }
- void L6470::goHome(){
-
-
-
- Xfer(GO_HOME);
- }
- void L6470::goMark(){
-
-
-
- Xfer(GO_MARK);
- }
- void L6470::setMark(long value){
- Xfer(MARK);
- if (value > 0x3FFFFF) value = 0x3FFFFF;
- if (value < -0x3FFFFF) value = -0x3FFFFF;
-
-
- Xfer((byte)(value >> 16));
- Xfer((byte)(value >> 8));
- Xfer((byte)(value));
- }
- void L6470::setMark(){
- long value = getPos();
-
- Xfer(MARK);
- if (value > 0x3FFFFF) value = 0x3FFFFF;
- if (value < -0x3FFFFF) value = -0x3FFFFF;
-
-
- Xfer((byte)(value >> 16));
- Xfer((byte)(value >> 8));
- Xfer((byte)(value));
- }
- void L6470::setAsHome(){
-
-
- Xfer(RESET_POS);
- }
- void L6470::resetDev(){
-
-
- Xfer(RESET_DEVICE);
- }
- void L6470::softStop(){
-
- Xfer(SOFT_STOP);
- }
- void L6470::hardStop(){
-
- Xfer(HARD_STOP);
- }
- void L6470::softFree(){
-
- Xfer(SOFT_HIZ);
- }
- void L6470::free(){
-
- Xfer(HARD_HIZ);
- }
- int L6470::getStatus(){
-
-
-
- int temp = 0;
- Xfer(GET_STATUS);
- temp = Xfer(0)<<8;
- temp |= Xfer(0);
- return temp;
- }
- unsigned long L6470::AccCalc(float stepsPerSecPerSec){
-
-
-
-
- float temp = stepsPerSecPerSec * 0.137438;
- if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::DecCalc(float stepsPerSecPerSec){
-
-
- float temp = stepsPerSecPerSec * 0.137438;
- if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::MaxSpdCalc(float stepsPerSec){
-
-
-
-
- float temp = stepsPerSec * .065536;
- if( (unsigned long) long(temp) > 0x000003FF) return 0x000003FF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::MinSpdCalc(float stepsPerSec){
-
-
-
-
- float temp = stepsPerSec * 4.1943;
- if( (unsigned long) long(temp) > 0x00000FFF) return 0x00000FFF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::FSCalc(float stepsPerSec){
-
-
-
-
- float temp = (stepsPerSec * .065536)-.5;
- if( (unsigned long) long(temp) > 0x000003FF) return 0x000003FF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::IntSpdCalc(float stepsPerSec){
-
-
-
-
- float temp = stepsPerSec * 4.1943;
- if( (unsigned long) long(temp) > 0x00003FFF) return 0x00003FFF;
- else return (unsigned long) long(temp);
- }
- unsigned long L6470::SpdCalc(float stepsPerSec){
-
-
-
-
-
- float temp = stepsPerSec * 67.106;
- if( (unsigned long) long(temp) > 0x000FFFFF) return 0x000FFFFF;
- else return (unsigned long)temp;
- }
- unsigned long L6470::Param(unsigned long value, byte bit_len){
-
-
-
- unsigned long ret_val=0;
-
- byte byte_len = bit_len/8;
- if (bit_len%8 > 0) byte_len++;
-
-
- unsigned long mask = 0xffffffff >> (32-bit_len);
- if (value > mask) value = mask;
-
-
-
-
-
-
- if (byte_len == 3) {
- ret_val |= long(Xfer((byte)(value>>16))) << 16;
-
- }
- if (byte_len >= 2) {
- ret_val |= long(Xfer((byte)(value>>8))) << 8;
-
- }
- if (byte_len >= 1) {
- ret_val |= Xfer((byte)value);
-
- }
-
-
-
- return (ret_val & mask);
- }
- byte L6470::Xfer(byte data){
-
-
-
-
- byte data_out;
- digitalWrite(_SSPin,LOW);
-
-
- data_out = SPI.transfer(data);
- digitalWrite(_SSPin,HIGH);
- return data_out;
- }
- void L6470::SetParam(byte param, unsigned long value){
- Xfer(SET_PARAM | param);
- ParamHandler(param, value);
- }
- unsigned long L6470::GetParam(byte param){
-
-
- Xfer(GET_PARAM | param);
- return ParamHandler(param, 0);
- }
- long L6470::convert(unsigned long val){
-
- int MSB = val >> 21;
-
- val = val << 11;
- val = val >> 11;
-
- if(MSB == 1) val = val | 0b11111111111000000000000000000000;
- return val;
- }
- unsigned long L6470::ParamHandler(byte param, unsigned long value){
-
-
-
- unsigned long ret_val = 0;
-
-
-
-
-
-
- switch (param)
- {
-
-
-
-
- case ABS_POS:
- ret_val = Param(value, 22);
- break;
-
-
- case EL_POS:
- ret_val = Param(value, 9);
- break;
-
-
- case MARK:
- ret_val = Param(value, 22);
- break;
-
-
- case SPEED:
- ret_val = Param(0, 20);
- break;
-
-
-
-
-
-
- case ACC:
- ret_val = Param(value, 12);
- break;
- case DEC:
- ret_val = Param(value, 12);
- break;
-
-
-
-
-
- case MAX_SPEED:
- ret_val = Param(value, 10);
- break;
-
-
-
-
-
-
- case MIN_SPEED:
- ret_val = Param(value, 12);
- break;
-
-
-
-
- case FS_SPD:
- ret_val = Param(value, 10);
- break;
-
-
-
-
-
- case KVAL_HOLD:
- ret_val = Xfer((byte)value);
- break;
- case KVAL_RUN:
- ret_val = Xfer((byte)value);
- break;
- case KVAL_ACC:
- ret_val = Xfer((byte)value);
- break;
- case KVAL_DEC:
- ret_val = Xfer((byte)value);
- break;
-
-
-
-
- case INT_SPD:
- ret_val = Param(value, 14);
- break;
- case ST_SLP:
- ret_val = Xfer((byte)value);
- break;
- case FN_SLP_ACC:
- ret_val = Xfer((byte)value);
- break;
- case FN_SLP_DEC:
- ret_val = Xfer((byte)value);
- break;
-
-
- case K_THERM:
- ret_val = Xfer((byte)value & 0x0F);
- break;
-
-
- case ADC_OUT:
- ret_val = Xfer(0);
- break;
-
-
-
- case OCD_TH:
- ret_val = Xfer((byte)value & 0x0F);
- break;
-
-
- case STALL_TH:
- ret_val = Xfer((byte)value & 0x7F);
- break;
-
-
-
-
-
-
-
-
- case STEP_MODE:
- ret_val = Xfer((byte)value);
- break;
-
-
-
- case ALARM_EN:
- ret_val = Xfer((byte)value);
- break;
-
-
-
-
-
- case CONFIG:
- ret_val = Param(value, 16);
- break;
-
-
-
-
- case STATUS:
- ret_val = Param(0, 16);
- break;
- default:
- ret_val = Xfer((byte)(value));
- break;
- }
- return ret_val;
- }
|