极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13045|回复: 4

TLC5615 折腾

[复制链接]
发表于 2016-10-20 17:57:47 | 显示全部楼层 |阅读模式
/*
2016.10.20 TLC5615 实验

前阵子做数控电源,DAC用的5615,结果可以实现基准电压的输出,但精度低的可怜,近日还想用它做个波形发生器,但输出和输入完全是乱的。仔细研究后发现,找到的TLC5615库是有问题的,只能处理8位数据。具体可以在每次库转换的位比较处加上串口输出,看看就明白了。没办法了,库不好用就自己整,手工处理高2位后再用位移处理低8位,然后达到满意效果。本文全部是程序,没有库,复制粘贴就好。废话已经在注释里。有人需要可以再发些图片。

已经注释 Serial.print 以提高速度,可以输出锯齿波 大概 280Hz@16M UNO
不注释下列所有  Serial.print 则可以在串口助手看到10进制变量data转化为二进制输出过程,但锯齿波只能达到5Hz,

TLC5615 连接 UNO 需要5条线

TLC5615 1脚 D7   DIN  数据位0或1
TLC5615 2脚 D6   SCLK 高电平时读一个数据
TLC5615 3脚 D5   CS   低电平使能
TLC5615 4脚 Dout   本实验悬空
TLC5615 5脚 GND
TLC5615 6脚 VCC    Ref,测试时可以接VCC,但转换只能到1-512,因为内部有运放乘以2,想做到1-1023,这里需要接1/2VCC
TLC5615 7脚 OUT    接万用表/示波器/或者接一个发光二极管
TLC5615 8脚 VCC
*/




int DIN =7;           //TLC5615 1脚
int SCLK =6;          //TLC5615 2脚
int CS =5;            //TLC5615 3脚


int i;          //循环变量
int j;          //循环变量
int a;          //写入DA值 ,十进制 0-1023
int v;          //函数中使用的变量

void WriteTLC5615(int data)     //TLC5615 DAC函数
{
           //Serial.print(data);
           //Serial.print(" ");
           digitalWrite(CS,LOW ); //片选低表示使能,开始接受数据
           digitalWrite(SCLK,LOW ); //时钟先是低,每高低变化一次读一位数据
  
  v=data;     //从函数获得数据值
  v>>=2;      //二进制只能处理8位,10位数据右移2位 (0-1023)

  if (v & B10000000)    //读最高位即第10位
            {
            digitalWrite(DIN,  HIGH);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("1");
            }
            else
            {
            digitalWrite(DIN,  LOW);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("0");
            }
  if (v & B01000000)    //读次高位即第9位
            {
            digitalWrite(DIN,  HIGH);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("1");
            }
            else
            {
            digitalWrite(DIN,  LOW);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("0");
            }       //完成最高2位写入


  v=data;       //因为上面右移,导致最低两位数据丢失,重新赋值给V
         
    for(i=0;i<8;i++)    //按位读出低8位数据并写入
         {      
            if (v & B10000000)    //位比较,可以参考TLC5615库,但是不比较最高的第10位,因为这个比较似乎只能在8位内完成。            
            {
            digitalWrite(DIN,  HIGH);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("1");
            }
            else
            {
            digitalWrite(DIN,  LOW);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("0");
            }
            v = v<<1;     //向左位移
         }        //完成后8位写入
            


            digitalWrite(DIN,  LOW);    //前面完成了有效的2+8位数据后,按TLC5615的设计,后面补两位任意数据达到12位数据
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("0");

            digitalWrite(DIN,  LOW);
            digitalWrite(SCLK, HIGH);
            digitalWrite(SCLK, LOW );
            //Serial.print("0");  //完成后2位无意义填充数据写入,达到2+8+2=12位数据写入



            digitalWrite(CS,HIGH ); //片选禁止,表示数据传输完成,开始一次DAC转换
           //Serial.println();
}

void setup()
{
  //Serial.begin(9600);
  pinMode(DIN, OUTPUT);
  pinMode(SCLK, OUTPUT);
  pinMode(CS, OUTPUT);
}

void loop()
{
  for(j=0;j<20;j++)
  {
  a = j*20;                //最高400,对应5Vx2x400/1024=4V ,接近4V的一个锯齿波280HZ       
  WriteTLC5615(a);        //a这里不方便用表达式,故多一个变量
  //delay(20);         //取消注释,加上延时,成为呼吸灯,每秒2次左右
  }
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-10-20 18:01:47 | 显示全部楼层
本帖最后由 kpj001 于 2016-10-20 18:03 编辑

long a;
long b;
int i;

void setup()
{
  Serial.begin(9600);
  b = B00000001;
}
void loop()
{
  
    Serial.println(b);
    a = b;   
            for(i=0;i<8;i++)//当b >512 时,归0, 所以只有8位 能被处理
            {
            if (a & 0x80)
            {
            Serial.print("1");
            }
            else
            {
            Serial.print("0");
            }      
            a = a<<1;
            }   
            Serial.println();
    b++;
    delay(100);   
}
// 为了清楚找到库里面if (a & 0x80)的问题所在,做了一个循环来看看是否能像期望一样达到十进制到10位2进制转换,看起来并不能
回复 支持 反对

使用道具 举报

发表于 2016-10-20 22:04:31 | 显示全部楼层
kpj001 发表于 2016-10-20 18:01
long a;
long b;
int i;


给你发个库吧,自己以前用过,在原来的库上有点修改(记得原始库有点问题,记不清啥问题了),绝对可以用,包括io和spi驱动

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-10 04:05 , Processed in 0.036642 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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