📄 adc22p.c
字号:
/*-----------------------------------------------------*
*文件描述:本文件包含了AD采集的2子程序,分别为: *
*(1)ADC22P:2片2543-22路AD采集 *
*(2)TLC2543:TLC2543芯片A/D转换子程序 *
*-------------《嵌入式应用技术基础教程》--------------*/
#include "Includes.h"
/*SPIInit:SPI初始化子程序-------------------------------*
*功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟 *
* 空闲低电平,比特率8分频, *
* 波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz)*
*参 数:无 *
*返 回:无 *
*------------------------------------------------------*/
#include "Includes.h"
void AD_SPIInit(void)
{
SPCR=0b00100010; //不产生中断、主机方式、时钟空闲低电平
SPSCR=0b00000001; //8分频
}
//------------------------------------------------------------------*
/*A/D转换并求平均值(22路)子程序(AD22P.ASM)-----------------------*
*功能:采集TLC2543(0)-(1)片,共22通道,取16次平均值放入内存ADValue *
*入口:无 *
*出口:ADValue--22路通道的16次平均采样值 *
*调用:TLC2543Z *
*-----------------------------------------------------------------*/
void ADC22P(INT16U *ADValue)
{
INT8U i,j,flag,buff[2];
INT8U cs,channel;
INT16U temp;
//A/D数据区清0
for(flag=0;flag<=21;flag++)
ADValue[flag]=0;
//启动第0片TLC2543的0通道转换,得到"空数据"--不要
//对22个通道采集数据,每一路采集16次,16次的数据总和-->ADValue
for(j=0;j<16;j++)
{
flag=0;
for(i=0;i<22;i++)
{
cs=i/11;
channel=i%11;
TLC2543(cs,channel,buff);
TLC2543(cs,channel,buff);
//从内存buff取出数据-->ADValue[flag]中
temp=*((unsigned int *)buff);
ADValue[flag]=ADValue[flag]+temp;
flag++;
}
}
//求22路A/D数据的16次平均值
for(flag=0;flag<=21;flag++)
ADValue[flag]=ADValue[flag]/16;
}
/*TLC2543芯片A/D转换子程序(TLC2543.c)--------------------------*
*TLC2543的接线: *
* ① I/O LOCK(18)接MC08HC908GP32的SPSCK(18) *
* ② DATA INPUT(17)接MC08HC908GP32的MOSI(17) *
* ③ DATA OUT (16)接MC08HC908GP32的MISO(16) *
* ④ 0-1片的片选CS(15)接分别接MC08HC908GP32的PTC0~1 *
*入口:cs-片号,channel-通道号0,1,2 ...10 buf-存放数据的首址 *
*出口:内存buf开始连续两个地址为取出的数(高4位、低8位) *
*--------------------------------------------------------------*/
void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
{
INT8U temp;
CS_D=0xff; //定义PTC为输出
CS_P = 0xff; //C口全为高电平
//TLC2543片选CS=1
CS_P &= ~(1<<cs); //相应片TLC2543的选CS=0,产生高到低的变化
SPIDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//发送完毕
while ((SPISCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//发送控制字,取出上次转换结果高字节
*buf = SPIDR; //*buf中存放的是D11~D4位
SPIDR = *buf; //上次转换结果低字节(后四位为0),握手信号
while ((SPISCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//发送完毕
while ((SPISCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//接收到数据
*(buf+1) = SPIDR;// *(buf+1)中存放D3~D0位
CS_P= 0xff; //TLC2543片选CS=1
//整合后*buf存放高四位(D11~D8),*(buf+1)中存放低八位(D7~D0)
*(buf+1) = (*(buf+1)>>4) | (*buf<<4);
*buf = *buf>>4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -