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]