3600|0

9790

帖子

24

TA的资源

版主

楼主
 

MSP430FR5969驱动LTC2756DAC [复制链接]

本帖最后由 littleshrimp 于 2017-11-25 17:22 编辑

LTC2756是Linear公司的一款(18)位电流输出ADC
使用SPI通信,可通过SPI设置输出范围


特点
最大 18 位 INL 误差:在整个温度范围内为 ±1LSB
可通过编程或引脚搭接提供 6 种输出范围:0V 至 5V、0V 至 10V、–2.5V 至 7.5V、±2.5V、±5V、±10V
在整个温度范围内可保证单调
干扰脉冲:0.4nV•s (3V),2nV•s (5V)
18 位稳定时间:2.1μs
2.7V 至 5.5V 单电源操作
对于所有代码基准电流保持恒定
电压控制型偏移和增益修整
具所有寄存器回读功能的串行接口
清至 0V 和上电复位至 0V (这与输出范围无关)
28 引脚 SSOP 封装



时序控制起来比较简单,通过SPI发送4个字节数据
第1个字节高4位为控制命令
剩余3个字节根据命令类型选择是code数据,还是span数据



电源使用+-5V和+-15V供电
正电源LDO使用了Linear的LT3042
负电源LDO使用了TI的TPS7A4901
LTC2756只有0.5uA的工作电流,除使用外部LDO还可以使用板子上的LTC6655电压基准供电
不过说这些都没什么用,因为我的万用表只有2位半
根本没法评测它的性能




连接好电源后通过MSP430FR5969使LTC2756输出电压在0~5V之间以1LSB递增
实验锯齿波效果





代码
  1. //******************************************************************************
  2. //                   MSP430FR5969
  3. //                 -----------------
  4. //             /|\|    虾扯蛋       |
  5. //              | |  Littleshrimp   |
  6. //              --|RST              |
  7. //                |                 |
  8. //                |             P1.6|-> Data Out (UCB0SIMO)
  9. //                |                 |
  10. //                |             P1.7|<- Data In (UCB0SOMI)
  11. //                |                 |
  12. //                |             P2.2|-> Serial Clock Out (UCB0CLK)
  13. //                |             P1.3|-> Slave Select (UCB0STE)
  14. //
  15. //******************************************************************************
  16. #include <msp430.h>
  17. #include <stdint.h>


  18. #define LTC2756_CMD_WRITE_SPAN          2       //Write Span
  19. #define LTC2756_CMD_WRITE_CODE          3       //Write Code
  20. #define LTC2756_CMD_UPDATE              4       //Update
  21. #define LTC2756_CMD_WRITE_SPAN_UPDATE   6       //Write Span; Update
  22. #define LTC2756_CMD_WRITE_CODE_UPDATE   7       //Write Code; Update
  23. #define LTC2756_CMD_READ_INPUT_SPAN     10      //Read Input Span Register
  24. #define LTC2756_CMD_READ_INPUT_CODE     11      //Read Input Code Register
  25. #define LTC2756_CMD_READ_DAC_SPAN       12      //Read DAC Span Register
  26. #define LTC2756_CMD_READ_DAC_CODE       13      //Read DAC Code Register
  27. #define LTC2756_CMD_NO_OPERATION        15      //No Operation

  28. //Table 2. Span Codes
  29. //S3 S2 S1 S0 SPAN
  30. #define SPAN_UNIPOLAR_0_5               0       //0 0 0 0 Unipolar 0V to 5V
  31. #define SPAN_UNIPOLAR_0_10              1       //0 0 0 1 Unipolar 0V to 10V
  32. #define SPAN_BIPOLAR_5                  2       //0 0 1 0 Bipolar –5V to 5V
  33. #define SPAN_BIPOLAR_10                 3       //0 0 1 1 Bipolar –10V to 10V
  34. #define SPAN_BIPOLAR_2_5                4       //0 1 0 0 Bipolar –2.5V to 2.5V
  35. #define SPAN_BIPOLAR_2_5_7_5            5       //0 1 0 1 Bipolar –2.5V to 7.5V

  36. #define CS_LOW()                        P1DIR|= BIT3;P1OUT &= ~BIT3;
  37. #define CS_HIGHT()                      P1DIR|= BIT3;P1OUT |= BIT3;

  38. void spi_init(void)
  39. {  
  40.   P1DIR |= BIT3;
  41.   P1OUT |= BIT3;
  42.   P2SEL1 |= BIT2;                           // Configure slave clk
  43.   P1SEL1 |= BIT6 | BIT7;                    // Configure SOMI and MISO
  44.   // Configure USCI_A0 for SPI operation
  45.   UCB0CTLW0 = UCSWRST;                      // **Put state machine in reset**
  46.                                             // 3-pin, 8-bit SPI master
  47.   UCB0CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB | UCMODE_1;
  48.                                             // Clock polarity high, MSB
  49.   UCB0CTLW0 |= UCSSEL__SMCLK;                // SMCLK
  50.   UCB0BR0 = 0x02;                           // /2
  51.   UCB0BR1 = 0;                              //
  52. // UCA0MCTLW = 0;                            // No modulation
  53.   UCB0CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**
  54. }
  55. uint8_t spi_write_read_byte(uint8_t d)
  56. {  
  57.   while ((UCB0STATW & UCBUSY));              // USCI transmitting or receiving
  58.   UCB0TXBUF = d;                            // Send next value
  59.   while ((UCB0STATW & UCBUSY));              // USCI transmitting or receiving
  60.   return UCB0RXBUF;
  61. }
  62. void dco_init(void)
  63. {  
  64.   PM5CTL0 &= ~LOCKLPM5;
  65.   // Configure one FRAM waitstate as required by the device datasheet for MCLK
  66.   // operation beyond 8MHz _before_ configuring the clock system.
  67.   FRCTL0 = FRCTLPW | NWAITS_1;

  68.   // Clock System Setup
  69.   CSCTL0_H = CSKEY >> 8;                    // Unlock CS registers
  70.   CSCTL1 = DCORSEL | DCOFSEL_4;             // Set DCO to 16MHz
  71.   CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO,
  72.                                             // ACLK = VLOCLK
  73.   CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
  74.   CSCTL0_H = 0;                             // Lock CS registers
  75. }
  76. void dac_set_span(uint8_t span)
  77. {
  78.   CS_LOW();
  79.   spi_write_read_byte(LTC2756_CMD_WRITE_SPAN << 4);
  80.   spi_write_read_byte(0x00);//bit17~bit10;
  81.   spi_write_read_byte(span);//bit9~bit2;
  82.   spi_write_read_byte(0x00);//bit1~bit0
  83.   CS_HIGHT();
  84. }
  85. void dac_set_code(uint32_t code)
  86. {
  87.   CS_LOW();
  88.   spi_write_read_byte(LTC2756_CMD_WRITE_CODE_UPDATE << 4);
  89.   spi_write_read_byte(code >> 10);//bit17~bit10;
  90.   spi_write_read_byte(code >> 2);//bit9~bit2;
  91.   spi_write_read_byte(code << 6);//bit1~bit0
  92.   CS_HIGHT();
  93. }
  94. int main(void)
  95. {
  96.   uint32_t i;
  97.   WDTCTL = WDTPW | WDTHOLD;                 // Stop watchdog timer
  98.   
  99.   dco_init();
  100.   
  101.   spi_init();
  102.   dac_set_span(SPAN_UNIPOLAR_0_5);
  103.   
  104.   while(1)
  105.   {
  106.     for(i=0;i<262144;i+=100)
  107.     {
  108.       dac_set_code(i);
  109.     }
  110.   }
  111. }
复制代码


工程
282.msp430fr5969 spi ltc2756.rar (7.34 KB, 下载次数: 9)

此内容由EEWORLD论坛网友littleshrimp原创,如需转载或用于商业用途请随意,无需征得作者同意或注明出处



点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表