回答

收藏

【GD32F450 试用】 A3.驱动ADS8332采集电位器电压

GD32 GD32 5419 人阅读 | 0 人回复 | 2017-06-14

本帖最后由 limale 于 2017-6-14 21:42 编辑

上一篇我们总算是用硬件SPI把OLED驱动起来了,虽然过程有点曲折可能对GD32了解的还是不够多。
这一篇我们还是使用硬件SPI来驱动一款TI的高速ADC芯片型号是ADS8332,这款芯片的特点有低功耗、16位分辨率、高达500-kSPS的采样速率、高达8通道的输入。


ADS8332数据手册:
ads8332.pdf (1.72 MB, 下载次数: 1)

除了SPI连接外我们还需要四个IO,三个输出控制和一个输入。
这里我们为了连线的方便选取PD3、PD4、PD6作为输出PD5作为输入,端口初始化如下。

  1.   /* ADS8332 GPIO config */
  2.                 gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_5);
  3.                 gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6);
  4.     gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6);
  5.                 gpio_bit_set(GPIOB,GPIO_PIN_3);
  6.                 gpio_bit_set(GPIOB,GPIO_PIN_4);
  7.                 gpio_bit_set(GPIOB,GPIO_PIN_6);
复制代码
为了有时候调试的方便,我们这里也把串口初始化并重定向到printf()
查看开发板原理图得知实际连接的是USART2,TX和RX分别是PD8和PD9。




所以我们进行如下的定义:


使用一下代码进行重定向到标准的输出设备。


这里需要注意的是,keil中这里的设置要勾选上该项。



在实际使用SPI方式发送16位的读取指令后,发现需要调用两次spi_i2s_data_receive(SPI0)才能接收到正确的数据,现在还没搞明白是什么原因。
  1. //读取CFR寄存器的值
  2. uint16_t ADS8332_SPI_ReadCFR(uint16_t Data)
  3. {
  4.         uint8_t txdata[1] = { 0 };
  5.         uint8_t rxdata[2] = { 0 };
  6.         uint16_t temp;
  7.         
  8.         txdata[0] = Data >>8;

  9.         ADS8332_CS_RESET;
  10.         spi_i2s_data_transmit(SPI0, txdata[0]);
  11.         while(spi_i2s_flag_get(SPI0, SPI_FLAG_TBE) == RESET);
  12.         ADS8332_Delay(0x0f);
  13.         rxdata[0] = spi_i2s_data_receive(SPI0);
  14.         rxdata[0] = spi_i2s_data_receive(SPI0);
  15.         
  16.         
  17.         spi_i2s_data_transmit(SPI0, 0x00);
  18.         while(spi_i2s_flag_get(SPI0, SPI_STAT_RBNE) == RESET);
  19.         ADS8332_Delay(0x0f);
  20.         rxdata[1] = spi_i2s_data_receive(SPI0);
  21.         rxdata[1] = spi_i2s_data_receive(SPI0);
  22.         ADS8332_CS_SET;
  23.         
  24.         temp = (rxdata[0] << 8) | rxdata[1];
  25.         return temp;
  26. }
复制代码
下边是在通道0上接了一个电位器转换得到的电压值,因为别的通道是悬空的所以数值是变化的。


同时在OLED上也可以看到转换的电压值。



虽然还有些问题搞得不是很清楚,但是总算是可以读取到转换结果了。下来准备再完善一下,就可以提交最终的项目方案了。等有空了再好好研究一下这么细节问题吧。
工程:
demo.zip (330.38 KB, 下载次数: 25)



关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条