模数转换器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版权协议,转载请附上原文出处链接和本声明。