极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11850|回复: 0

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

[复制链接]
发表于 2012-7-23 17:53:13 | 显示全部楼层 |阅读模式
本帖最后由 friskit 于 2012-7-23 17:58 编辑

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

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

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

  1. /*
  2. * X9313W.cpp
  3. *
  4. *  Created on: 2012-7-23
  5. *      Author: Friskit
  6. */

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


  15. X9313W::X9313W(int incP,int udP,int csP,int hcycle){
  16.         this->incPin = incP;
  17.         this->udPin = udP;
  18.         this->csPin = csP;
  19.         this->hCycle = hcycle;
  20.         pinMode(incPin,OUTPUT);
  21.         pinMode(udPin,OUTPUT);
  22.         pinMode(csPin,OUTPUT);
  23.         digitalWrite(incPin,HIGH);
  24. }

  25. int X9313W::resetToMin(){
  26.         while(this->RLevel>MIN){
  27.                 turnDown();//不断降低直到RLevel=0
  28.         }
  29.         return this->RLevel;
  30. }

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


  37. void X9313W::_nop_(){
  38.         delay(hCycle);
  39. }

  40. int X9313W::turnUp(){

  41.         enable();
  42.         digitalWrite(this->udPin,UP);
  43.         digitalWrite(this->incPin,LOW);
  44.         _nop_();
  45.         digitalWrite(this->incPin,HIGH);
  46.         _nop_();
  47.         disable();
  48.         this->RLevel++;
  49.         return RLevel;
  50. }

  51. int X9313W::turnDown(){
  52.         enable();
  53.         digitalWrite(this->udPin,DOWN);
  54.         digitalWrite(this->incPin,LOW);
  55.         _nop_();
  56.         digitalWrite(this->incPin,HIGH);
  57.         _nop_();
  58.         disable();
  59.         this->RLevel--;
  60.         return RLevel;
  61. }

  62. int X9313W::getRLevel(){
  63.         return this->RLevel;
  64. }

  65. int X9313W::setRLevel(int target){
  66.         if(this->RLevel>target){
  67.                 for(int i=RLevel;i>target;i--){
  68.                         enable();
  69.                         turnDown();
  70.                         disable();
  71.                 }
  72.                 return this->RLevel;
  73.         }else if(this->RLevel<target){
  74.                 for(int i=RLevel;i<target;i++){
  75.                         enable();
  76.                         turnUp();
  77.                         disable();
  78.                 }
  79.                 return this->RLevel;
  80.         }else if(this->RLevel==target){
  81.                 return this->RLevel;
  82.         }
  83. }

  84. void X9313W::enable(){
  85.         _nop_();
  86.         digitalWrite(csPin,EA);
  87.         _nop_();
  88. }

  89. void X9313W::disable(){
  90.         _nop_();
  91.         digitalWrite(csPin,DA);
  92.         _nop_();
  93. }
复制代码



还有头文件:

  1. /*
  2. * X9313W.h
  3. *
  4. *  Created on: 2012-7-23
  5. *      Author: Friskit
  6. */

  7. #ifndef X9313W_H_
  8. #define X9313W_H_

  9. class X9313W {

  10. private:
  11.         int incPin;
  12.         int udPin;
  13.         int csPin;
  14.         int RLevel;
  15.         int hCycle;
  16.         void _nop_();
  17.         void enable();
  18.         void disable();

  19. public:
  20.         X9313W(int incPin,int udPin,int csPin,int hCycle);
  21.         int setRLevel(int target);
  22.         int resetToMin();
  23.         int resetToMax();
  24.         int turnUp();
  25.         int turnDown();
  26.         int getRLevel();
  27. };

  28. #endif /* X9313W_H_ */
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 16:31 , Processed in 0.041903 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表