friskit 发表于 2012-7-23 17:53:13

Arduino用的X9313W系列数控电位器驱动

本帖最后由 friskit 于 2012-7-23 17:58 编辑

最近在做些东西,利用到了X9313W。
啥是数控电位器?说白了就是用数字电路控制的电位器。

X9313W系列数控电位器其实就是一个数字计数器加上一个电阻矩阵。通过计数器的值来改变电阻值。具体IC手册在网上到处都有。

直接贴源码,函数功能很简单,看名就能明白。。。
注意一下:
构造函数的参数值分别是“!INC端”,“U/!D”,"!CS使能端"以及“时钟周期”。
时钟周期不是标准的“时钟周期”,别做太极端的测试。。。因为我这里的项目对精度没那么大要求,我就没仔细设置
时钟周期亲测1毫秒可用……实际时钟周期大约4倍左右……
/*
* X9313W.cpp
*
*Created on: 2012-7-23
*      Author: Friskit
*/

#include "X9313W.h"
#include "Arduino.h"
#define MIN                0
#define        MAX                31
#define UP                HIGH        //UD端置上升位
#define DOWN        LOW                //UD端置下降位
#define EA                LOW                //CS端低位使能
#define DA                HIGH        //CS端高位中断保存


X9313W::X9313W(int incP,int udP,int csP,int hcycle){
        this->incPin = incP;
        this->udPin = udP;
        this->csPin = csP;
        this->hCycle = hcycle;
        pinMode(incPin,OUTPUT);
        pinMode(udPin,OUTPUT);
        pinMode(csPin,OUTPUT);
        digitalWrite(incPin,HIGH);
}

int X9313W::resetToMin(){
        while(this->RLevel>MIN){
                turnDown();//不断降低直到RLevel=0
        }
        return this->RLevel;
}

int X9313W::resetToMax(){
        while(this->RLevel<MAX){
                turnUp();//不断太高直到RLevel=31
        }
        return this->RLevel;
}


void X9313W::_nop_(){
        delay(hCycle);
}

int X9313W::turnUp(){

        enable();
        digitalWrite(this->udPin,UP);
        digitalWrite(this->incPin,LOW);
        _nop_();
        digitalWrite(this->incPin,HIGH);
        _nop_();
        disable();
        this->RLevel++;
        return RLevel;
}

int X9313W::turnDown(){
        enable();
        digitalWrite(this->udPin,DOWN);
        digitalWrite(this->incPin,LOW);
        _nop_();
        digitalWrite(this->incPin,HIGH);
        _nop_();
        disable();
        this->RLevel--;
        return RLevel;
}

int X9313W::getRLevel(){
        return this->RLevel;
}

int X9313W::setRLevel(int target){
        if(this->RLevel>target){
                for(int i=RLevel;i>target;i--){
                        enable();
                        turnDown();
                        disable();
                }
                return this->RLevel;
        }else if(this->RLevel<target){
                for(int i=RLevel;i<target;i++){
                        enable();
                        turnUp();
                        disable();
                }
                return this->RLevel;
        }else if(this->RLevel==target){
                return this->RLevel;
        }
}

void X9313W::enable(){
        _nop_();
        digitalWrite(csPin,EA);
        _nop_();
}

void X9313W::disable(){
        _nop_();
        digitalWrite(csPin,DA);
        _nop_();
}



还有头文件:

/*
* X9313W.h
*
*Created on: 2012-7-23
*      Author: Friskit
*/

#ifndef X9313W_H_
#define X9313W_H_

class X9313W {

private:
        int incPin;
        int udPin;
        int csPin;
        int RLevel;
        int hCycle;
        void _nop_();
        void enable();
        void disable();

public:
        X9313W(int incPin,int udPin,int csPin,int hCycle);
        int setRLevel(int target);
        int resetToMin();
        int resetToMax();
        int turnUp();
        int turnDown();
        int getRLevel();
};

#endif /* X9313W_H_ */
页: [1]
查看完整版本: Arduino用的X9313W系列数控电位器驱动