国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F103硬件SPI驅(qū)動ADS1256

這篇具有很好參考價值的文章主要介紹了STM32F103硬件SPI驅(qū)動ADS1256。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一:

最近實(shí)驗(yàn)室有幾個項(xiàng)目都需要用到高分辨率AD轉(zhuǎn)換,于是就開始了ADS1256的開發(fā)。

stm32 ads1256,stm32

新手,焊得丑,見諒(能用就行)


二:

本以為很容易就能做完,結(jié)果被采樣速率的問題困擾了很久。

代碼如下,使用2.5V基準(zhǔn)源進(jìn)行測試,結(jié)果在讀ADS時經(jīng)常出現(xiàn)讀出0xFFFFFF的情況,只能忍住悲傷開始查找資料,后來在TI論壇上看到一位大哥說這種情況一般是SPI沒有讀取到數(shù)據(jù)于是直接將ADS初始化中的10SPS改成30000SPS,結(jié)果一測試OK了。



void ADS1256_Init(void)
{ 	
  ADS1256WREG(ADS1256_STATUS,0x04);    
	ADS1256WREG(ADS1256_MUX,0x01);
  ADS1256WREG(ADS1256_ADCON,0x00);              
  ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  
  ADS1256WREG(ADS1256_IO,0x00);  	
}

stm32 ads1256,stm32


三:

可能因?yàn)锳DS1256是外部ADC,數(shù)據(jù)轉(zhuǎn)換速率慢于單片機(jī)時就會造成SPI上沒有數(shù)據(jù)導(dǎo)致單片機(jī)讀取不到吧,模數(shù)轉(zhuǎn)換很多東西的確比較復(fù)雜,以前只注重簡單的應(yīng)用,還是需要以后繼續(xù)學(xué)習(xí),也請各位大哥多多指正。

最后附上代碼:

ADS1256.c

#include "ADS1256.h"

#define  FILTER_NUM 10

unsigned int ads_value;
unsigned int ads_flitter[FILTER_NUM+1];
long double ads_voltage;

void SPI1_Init(void)
{
 SPI_InitTypeDef  SPI_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 /****Initial SPI1******************/
 
 /* Enable SPI1 and GPIOA clocks */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
 

 /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 //SPI1 NSS 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
 
	  /* SPI1 configuration */ 
	 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
	 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                   
	 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                
	 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                 
	 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;               
	 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  
	 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 
	 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;      
	 SPI_InitStructure.SPI_CRCPolynomial = 7;         
	 SPI_Init(SPI1, &SPI_InitStructure);
	 /* Enable SPI1  */
	 SPI_Cmd(SPI1, ENABLE);
}  

void Init_ADS1256_GPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
    GPIO_Init(GPIOA, &GPIO_InitStructure);   

    SPI1_Init();   
}

unsigned char SPI_WriteByte(unsigned char TxData)
{
	unsigned char RxData=0;

  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);                                                
  SPI_I2S_SendData(SPI1,TxData);

  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);

  RxData=SPI_I2S_ReceiveData(SPI1);

  return RxData;
} 

void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{
  GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	
  while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));

  SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));

  SPI_WriteByte(0x00);

  SPI_WriteByte(databyte);
  GPIO_SetBits(GPIOA, GPIO_Pin_4);
}

void ADS1256_Init(void)
{ 	
  ADS1256WREG(ADS1256_STATUS,0x04);    
	ADS1256WREG(ADS1256_MUX,0x01);
  ADS1256WREG(ADS1256_ADCON,0x00);                
  ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_30000SPS); 
  ADS1256WREG(ADS1256_IO,0x00);  	
}

unsigned int ADS1256ReadData(unsigned char channel)  
{

  unsigned int data;
		
	ADS1256WREG(ADS1256_MUX, channel | ADS1256_MUXN_AIN1);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	
  while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));
	
	
	SPI_WriteByte(ADS1256_CMD_SYNC);
	
  SPI_WriteByte(ADS1256_CMD_WAKEUP);        
	
  SPI_WriteByte(ADS1256_CMD_RDATA);
	
	data |= (SPI_WriteByte(0xff)<<16);
	
  data |= (SPI_WriteByte(0xff)<<8);
	
  data |= SPI_WriteByte(0xff);
	
	return data;
}

unsigned int ADS_Flitter()
{
	unsigned char i=0;
	
	ads_flitter[FILTER_NUM+1] = 0;
	for(i=0;i<FILTER_NUM;i++)
	{
		ads_flitter[i] = ADS1256ReadData(0);

		ads_flitter[FILTER_NUM+1] += ads_flitter[i];
	}
	ads_flitter[FILTER_NUM+1] = ads_flitter[FILTER_NUM+1]/FILTER_NUM;
	ads_value = ads_flitter[FILTER_NUM+1];
	
	return ads_value;
}

long double ADS_Voltage()
{
	ads_voltage = (long double)ADS_Flitter()*5/0x7FFFFF;
  return ads_voltage;
}

ADS1256.h

#ifndef __ADS1256_H_
#define __ADS1256_H_
#include "stm32f10x.h"

#define RCC_ADS1256DRDY                             RCC_APB2Periph_GPIOA
#define GPIO_ADS1256DRDY_PORT                       GPIOA  
#define GPIO_ADS1256DRDY                            GPIO_Pin_0

// define commands 
#define ADS1256_CMD_WAKEUP   0x00 
#define ADS1256_CMD_RDATA    0x01 
#define ADS1256_CMD_RDATAC   0x03 
#define ADS1256_CMD_SDATAC   0x0f 
#define ADS1256_CMD_RREG     0x10 
#define ADS1256_CMD_WREG     0x50 
#define ADS1256_CMD_SELFCAL  0xf0 
#define ADS1256_CMD_SELFOCAL 0xf1 
#define ADS1256_CMD_SELFGCAL 0xf2 
#define ADS1256_CMD_SYSOCAL  0xf3 
#define ADS1256_CMD_SYSGCAL  0xf4 
#define ADS1256_CMD_SYNC     0xfc 
#define ADS1256_CMD_STANDBY  0xfd 
#define ADS1256_CMD_REST    0xfe 
 
// define the ADS1256 register values 
#define ADS1256_STATUS       0x00   
#define ADS1256_MUX          0x01   
#define ADS1256_ADCON        0x02   
#define ADS1256_DRATE        0x03   
#define ADS1256_IO           0x04   
#define ADS1256_OFC0         0x05   
#define ADS1256_OFC1         0x06   
#define ADS1256_OFC2         0x07   
#define ADS1256_FSC0         0x08   
#define ADS1256_FSC1         0x09   
#define ADS1256_FSC2         0x0A 
 
 
// define multiplexer codes 
#define ADS1256_MUXP_AIN0   0x00 
#define ADS1256_MUXP_AIN1   0x10 
#define ADS1256_MUXP_AIN2   0x20 
#define ADS1256_MUXP_AIN3   0x30 
#define ADS1256_MUXP_AIN4   0x40 
#define ADS1256_MUXP_AIN5   0x50 
#define ADS1256_MUXP_AIN6   0x60 
#define ADS1256_MUXP_AIN7   0x70 
#define ADS1256_MUXP_AINCOM 0x80 
 
#define ADS1256_MUXN_AIN0   0x00 
#define ADS1256_MUXN_AIN1   0x01 
#define ADS1256_MUXN_AIN2   0x02 
#define ADS1256_MUXN_AIN3   0x03 
#define ADS1256_MUXN_AIN4   0x04 
#define ADS1256_MUXN_AIN5   0x05 
#define ADS1256_MUXN_AIN6   0x06 
#define ADS1256_MUXN_AIN7   0x07 
#define ADS1256_MUXN_AINCOM 0x08   
 
 
// define gain codes 
#define ADS1256_GAIN_1      0x00 
#define ADS1256_GAIN_2      0x01 
#define ADS1256_GAIN_4      0x02 
#define ADS1256_GAIN_8      0x03 
#define ADS1256_GAIN_16     0x04 
#define ADS1256_GAIN_32     0x05 
#define ADS1256_GAIN_64     0x06 
//#define ADS1256_GAIN_64     0x07 
 
//define drate codes 
#define ADS1256_DRATE_30000SPS   0xF0 
#define ADS1256_DRATE_15000SPS   0xE0 
#define ADS1256_DRATE_7500SPS   0xD0 
#define ADS1256_DRATE_3750SPS   0xC0 
#define ADS1256_DRATE_2000SPS   0xB0 
#define ADS1256_DRATE_1000SPS   0xA1 
#define ADS1256_DRATE_500SPS    0x92 
#define ADS1256_DRATE_100SPS    0x82 
#define ADS1256_DRATE_60SPS     0x72 
#define ADS1256_DRATE_50SPS     0x63 
#define ADS1256_DRATE_30SPS     0x53 
#define ADS1256_DRATE_25SPS     0x43 
#define ADS1256_DRATE_15SPS     0x33 
#define ADS1256_DRATE_10SPS     0x23 
#define ADS1256_DRATE_5SPS      0x13 
#define ADS1256_DRATE_2_5SPS    0x03


void SPI1_Init(void);
void Init_ADS1256_GPIO(void);
unsigned char SPI_WriteByte(unsigned char TxData);
void ADS1256WREG(unsigned char regaddr,unsigned char databyte);
void ADS1256_Init(void);
unsigned int ADS1256ReadData(unsigned char channel);
unsigned int ADS_Flitter(void);
long double ADS_Voltage(void);

#endif

main.h文章來源地址http://www.zghlxwxcb.cn/news/detail-525544.html

/**
  ******************************************************************************
  * @file    Project/STM32F10x_StdPeriph_Template/main.c 
  * @author  MCD Application Team
  * @version V3.5.0
  * @date    08-April-2011
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>
  ******************************************************************************
  */  

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "ADS1256.h"
#include <stdio.h>

extern	unsigned int ads_value;
extern	long double ads_voltage;
	
int main(void)
{

	Init_ADS1256_GPIO();
	ADS1256_Init();
	
  while (1)
  {
		ADS_Voltage();
  }
}

到了這里,關(guān)于STM32F103硬件SPI驅(qū)動ADS1256的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32開發(fā)(十)STM32F103 通信 —— SPI通信編程詳解

    ??《上一篇》 ???《主目錄》 ???《下一篇》 本實(shí)驗(yàn)通過STM32F103 的SPI功能,實(shí)現(xiàn)對W25Q64JVSSIQ (Flash芯片)芯片擦除,讀數(shù)據(jù),寫數(shù)據(jù)等操作。 本實(shí)驗(yàn)內(nèi)容知識點(diǎn): 1、SPI通信協(xié)議介紹 2、

    2024年02月07日
    瀏覽(25)
  • 嵌入式硬件——stm32F103C8T6

    嵌入式硬件——stm32F103C8T6

    如下圖:? ? 處理器核心:STM32F103C8T6內(nèi)置了ARM Cortex-M3處理器,這是一種高性能、低功耗的32位RISC處理器,適用于嵌入式系統(tǒng)。 時鐘速度:它可以工作在不同的時鐘速度,最高主頻可達(dá)72 MHz。 存儲器:包括64KB的Flash程序存儲器用于存儲程序代碼,以及20KB的SRAM用于存儲數(shù)據(jù)和

    2024年02月05日
    瀏覽(125)
  • STM32F103驅(qū)動oled顯示屏

    STM32F103驅(qū)動oled顯示屏

    oled顯示屏和其他顯示屏類似,不過他只有0.96英寸,屏幕較小,但是使用起來比較方便。有二種驅(qū)動方式,分別為IIC,和SPI驅(qū)動。驅(qū)動方式比較簡單。IIC驅(qū)動的話只需要4根線,電源,地線,數(shù)據(jù)線,和時鐘線。 我這里使用的是IIC協(xié)議驅(qū)動oled顯示屏,如果想了解IIC協(xié)議的可以看

    2024年02月11日
    瀏覽(40)
  • 【開源硬件篇】STM32F103C8T6核心板

    【開源硬件篇】STM32F103C8T6核心板

    一、STM32F103C8T6芯片 1.1 STM32F103C8T6簡介 ? STM32F103C8T6是一款由意法半導(dǎo)體公司(ST)推出的基于Cortex-M3內(nèi)核的32位微控制器,硬件采用LQFP48封裝。 ? 具體參數(shù)為: 64K x 8bit的Flash 20K x 8bit的SRAM 37個GPIO,分別為PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1 2個12bit ADC合計(jì)12路通道,外部通道:

    2024年02月03日
    瀏覽(86)
  • 野火STM32F103驅(qū)動GT911觸摸芯片

    野火STM32F103驅(qū)動GT911觸摸芯片

    芯片介紹 GT911 是專為 7”~8”設(shè)計(jì)的新一代 5 點(diǎn)電容觸控 方案,擁有 26 個驅(qū)動通道和 14 個感 應(yīng)通道,以滿足更高的 touch 精度要求。 GT911 可同時識別 5 個觸摸點(diǎn)位的 實(shí)時準(zhǔn)確位置 , 移動軌跡 及 觸摸面積。 并可根據(jù)主控需要,讀取相應(yīng)點(diǎn)數(shù)的觸摸信息。 芯片原理圖 管腳定

    2024年02月06日
    瀏覽(23)
  • STM32F103ZET6 驅(qū)動 OLED

    STM32F103ZET6 驅(qū)動 OLED

    目錄 前言 OLED模塊的基本了解 OLED驅(qū)動程序的開發(fā) 前言 ? 大家好,這是我第一次發(fā)帖,由于,我的技術(shù)并不成熟,程序難免有編寫不規(guī)范的地方,希望讀者能夠指正,也希望這篇帖子能夠讓讀者對OLED模塊有個大致的了解。很高興能與大家交流。 OLED模塊的基本了解 OLED模塊的

    2024年02月14日
    瀏覽(28)
  • GD32F103 硬件SPI通信

    GD32F103 硬件SPI通信

    SPI既可以做主機(jī)也可以做從機(jī)。 當(dāng)做主機(jī)時。MOSI,SCK,CS都是作為輸出。?而作為從機(jī)時。MOSI,SCK,CS都是作為輸入。 ?所以SPI的硬件電路應(yīng)該實(shí)現(xiàn)這樣的功能。 1. GD32框圖 如下圖做主機(jī)的數(shù)據(jù)流向: ? 如下圖做從機(jī)的數(shù)據(jù)流向:? ? 2. STM32框圖? 通過一些寄存器的配置來控制

    2024年02月02日
    瀏覽(24)
  • 【開源硬件篇】STM32F103C8T6主控板

    【開源硬件篇】STM32F103C8T6主控板

    設(shè)計(jì)目標(biāo) 能夠控制9路5V舵機(jī) 具有3路串口通信接口,其中有一路串口設(shè)計(jì)為串口轉(zhuǎn)USB,通過一根USB數(shù)據(jù)線直接進(jìn)行通信 拓展口,除了所用到的功能模塊的IO口,其余的IO口都拓展出去 一路LED燈5V電源指示燈 設(shè)計(jì)了兩組3V3-GND引腳 一、STM32F103C8T6核心板外圍引腳電路 1.1 原理圖設(shè)

    2024年02月06日
    瀏覽(25)
  • STM32驅(qū)動ADS1256串口輸出-AD轉(zhuǎn)換

    STM32驅(qū)動ADS1256串口輸出-AD轉(zhuǎn)換

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模數(shù)轉(zhuǎn)換器。該芯片還帶有4個可編程的I/O口、輸入緩沖器和可編程增益放大器等,芯片本身可以測量0-5v的信號,高電壓采集可以通過把信號分壓成0-5v的范圍內(nèi)再給模塊輸入,所以ADS1256可以采集市面上大多數(shù)的標(biāo)準(zhǔn)電

    2024年02月16日
    瀏覽(34)
  • 基于STM32F103的PWM電機(jī)驅(qū)動A4950

    基于STM32F103的PWM電機(jī)驅(qū)動A4950

    A4950的峰值輸出電流可達(dá)±3.5 A,工作電壓為7.6~40v。 優(yōu)點(diǎn):相對于L298N模塊控制2個電機(jī)正反轉(zhuǎn)僅需要4個I/O口,體積小,發(fā)熱低。 缺點(diǎn):需要2個PWM引腳才能控制正反轉(zhuǎn),所以控制2個電機(jī)需要4PWM引腳,會使用STM32F103芯片一個定時器的全部PWM通道。 A4950模塊是靠輸入2路的PWM占空

    2024年02月04日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包