模数转换器ADS1118 四通道采集电压 stm32f103

模数转换器ADS1118 四通道采集电压 stm32f103

寄存器配置

uint16_t cha0_count=0xD08B;//0xC08B 0xD08B 0xE08B 0xF08B
uint16_t cha1_count=0xE08B;
uint16_t cha2_count=0xF08B;
uint16_t cha3_count=0xC08B;

引脚配置

配置 SCK引脚, GPIOA^5 
配置 DOUT引脚,GPIOA^6 
配置 DIN引脚,GPIOA^7 
配置CE引脚,GPIOA^4

代码ADS1118.C

#include "ADS1118.h"

volatile uint8_t readata1;
volatile uint8_t readata2;
volatile uint8_t readata3;
volatile uint8_t readata4;
volatile uint32_t readata;

void GPIO_ADS_Init(void)
{
	SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    /*SCK,MISO,MOSI,GPIOA^5,GPIOA^6,GPIOA^7 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

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

    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);

    CS_SET; 
 
    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_64; 
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  				
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1, &SPI_InitStructure);

    SPI_Cmd(SPI1, ENABLE);
}

int8_t SPI_ADS_Send(uint8_t dat)	 //发送数据
{
 /* 当 SPI发送缓冲器非空时等待 */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  
    /* 通过 SPI2发送一字节数据 */
    SPI_I2S_SendData(SPI1, dat);		
 
    /* 当SPI接收缓冲器为空时等待 */
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

    /* Return the byte read from the SPI bus */
    return SPI_I2S_ReceiveData(SPI1);
}

void delay( uint32_t nCount )
{
    for(; nCount != 0; nCount--)
    {
        ;
    }
}

uint32_t SPI_RW_Reg(uint16_t CofigReg)
{

    delay(10);
    readata1=SPI_ADS_Send((uint8_t)(CofigReg>>8));
    readata2=SPI_ADS_Send((uint8_t)CofigReg);
    readata=( ((uint32_t)readata1<<8) | (uint32_t)readata2 );
    delay(1000);
    if(readata>65499)
    readata=0;
    return readata;
}


代码ADS1118.H

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

#define CS_RESET GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define CS_SET GPIO_SetBits(GPIOA,GPIO_Pin_4)

void GPIO_ADS_Init(void);
int8_t SPI_ADS_Send(uint8_t dat);
void delay( uint32_t nCount );

uint32_t SPI_RW_Reg(uint16_t CofigReg);





#endif

代码

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "exti.h"
#include "ADS1118.h"
#include "deal.h"
#include "timebreak.h"
#include "soundout.h"




/*
	配置寄存器的值:0x8283  ( 1000 0010 1000 0011 )
			bit15:1
			bit14-12: 100 AIN0模拟输入 
			bit11-9:  001 参考电压4.096V
								000 参考电压6.144V
			bit8:     0   连续转换模式
			bit4      0   ADC模式
		
	配置 SCK引脚, GPIOA^5 
	配置 DOUT引脚,GPIOA^6 
	配置 DIN引脚,GPIOA^7 
	配置CE引脚,GPIOA^4
  LCD_DrawLine(500,360,800, 360);
  LCD_Fill(200,0,210,210,0x0000);
	ch0_offset=get_offset(cha0_count);
  ch1_offset=get_offset(cha1_count);
	ch2_offset=get_offset(cha2_count);
	ch3_offset=get_offset(cha3_count);
  printf("%fV ",ch1_volte);
*/

int main(void)
{
  SystemInit();	 
	GPIO_ADS_Init();      //ADS1118 引脚配置
	delay_init();	    	  //延时函数 初始化 
	delay_ms(10);
	uart_init(115200);	 	//串口初始化115200	
	LCD_Init();		       	//LCD初始化								    
	delay_ms(10);	
	LED_Init();
	delay_ms(10);
	tim2_config();  
   LCD_interface();
   POINT_COLOR=BLACK; 
	TIM4_PWM_Init(99,0); 
   showhz24str(20,50,BLACK,WHITE,"电压"); 
   showhz24str(20,100,BLACK,WHITE,"电压"); 
	showhz24str(20,150,BLACK,WHITE,"电压"); 
	showhz24str(20,200,BLACK,WHITE,"电压"); 
	LCD_ShowString(20+24*2,50,200,24,24,"L-X: .");	
	LCD_ShowString(20+24*2,100,200,24,24,"L-Y: .");	
	LCD_ShowString(20+24*2,150,200,24,24,"R-X: .");	
	LCD_ShowString(20+24*2,200,200,24,24,"R-Y: .");	
	LCD_ShowString(245,5,200,24,24,"POSE");	

	while(1)
	{
		  LCD_interface() ;
		
		  ch0_volte=ch0_AD*0.1875/1000;
		  ch1_volte=ch1_AD*0.1875/1000;
		  ch2_volte=ch2_AD*0.1875/1000;
		  ch3_volte=ch3_AD*0.1875/1000-1.04;//buchang 
		
		  ch0_AD_int=ch0_volte;
		  ch1_AD_int=ch1_volte;
		  ch2_AD_int=ch2_volte;
		  ch3_AD_int=ch3_volte;
			
	    LCD_ShowxNum(20+24*4,50,ch0_volte,1,24,0);
	    LCD_ShowxNum(20+24*4,100,ch1_volte,1,24,0);
	    LCD_ShowxNum(20+24*4,150,ch2_volte,1,24,0);
	    LCD_ShowxNum(20+24*4,200,ch3_volte,1,24,0);
			
		  LCD_ShowNum(20+24*5,50,(ch0_volte-ch0_AD_int)*1000,3,24);
		  LCD_ShowNum(20+24*5,100,(ch1_volte-ch1_AD_int)*1000,3,24);
		  LCD_ShowNum(20+24*5,150,(ch2_volte-ch2_AD_int)*1000,3,24);
		  LCD_ShowNum(20+24*5,200,(ch3_volte-ch3_AD_int)*1000,3,24);  
		 	pose_deal();


	}
}

	void TIM2_IRQHandler(void)
{
	  static u8 k=0;
    if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
			switch (k)
			{
				case 1:
				{
					ch0_AD=get_AD(cha0_count);
			  	LCD_Fill(0,250, 320, 450,0xffff);
					break;   
				}
				case 2:
				{
					ch1_AD=get_AD(cha1_count);
			  	LCD_Fill(0,250, 320, 450,0xffff);
					break; 
				}
				case 3:
				{
					ch2_AD=get_AD(cha2_count);
			  	LCD_Fill(0,250, 320, 450,0xffff);
					break;
				}					
				case 4:
				{
					ch3_AD=get_AD(cha3_count);
			  	LCD_Fill(0,250, 320, 450,0xffff);
					break; 
				}
				case 5:
				{					
          pose_judge();
					break; 
				}
				default: break;
			}
			k++;if(k>5) k=1;
    }
    TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);//清除标志位
}






版权声明:本文为qq_44645174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。