|
本帖最后由 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_ */
复制代码 |
|