资源描述
#include "sys.h"
#include "delay.h"
#include "gpio.h"
#include "wdog.h"
#include "uart.h"
#include "led.h"
#include "pit.h"
#include "ftm.h"
#include "lcd.h"
#include "exti.h"
#include "adc.h"
// K10核心板
// 实验8 ADC 实验
// YANDLD@UPC
int main(void)
{
uint8_t i;
DELAY_Init(96); //延时初始化 CORE/SYSTEM CLOCK 96M BUSCLOCK 48M
LED_Init(); //LED初始化
LCD_Init(); //SPILCD初始化
BACK_COLOR=BLACK; //背景色黑色
LCD_Clear(BLACK); //黑色背景
POINT_COLOR =0X5458;//前景浅蓝色
LCD_ShowString(30,50," ADC TEST");
LCD_ShowString(30,70," YANDLD@UPC");
LCD_ShowString(10,90, "AD-4 E16:");
LCD_ShowString(10,110,"AD-5 E17:");
LCD_ShowString(10,130,"AD-6 E18:");
LCD_ShowString(10,150,"AD-7 E19:");
//注意单端下只开通ADC0-4,5,6,7通道 其余请自行配置
ADC_Init(ADC0,0,16,4); //ADC0-4通道 PTE16
ADC_Init(ADC0,0,16,5); //ADC0-5通道 PTE17
ADC_Init(ADC0,0,16,6); //ADC0-6通道 PTE18
ADC_Init(ADC0,0,16,7); //ADC0-7通道 PTE19
while(1)
{
for(i=0;i<4;i++)
{
LCD_ShowNum(110,90+20*i,ADC_Get(ADC0,i+4)>>8,4,ASCII1608C); //显示AD数据
}
LED0=!LED0;
DELAY_Ms(100);
}
}
#include "adc.h"
//********************************************************************************
//本程序只供学习使用 祝愿每一个参加智能车比赛的队伍都有出色发挥!
//硬件 :超核电子K10 核心板
//目标芯片:K10N512VLL10
//作者 :YANDLD 中国石油大学(华东)
//修改日期:2012/1/5
//版本:V1.0
//Copyright(C) YANDLD 2012-2022
//All rights reserved
//********************************************************************************
//开启adc0或1,默认使用a通道即软件触发,配置时钟源为bus clock,不分频,
//转换速度正常,参考电压选择外部电压,配置为软件触发转换 (大部分为默认值)
//并进行了校准。这里在单端模式下仅开启adc0的4,5,6,7通道的引脚,
//在差分模式下可以开启adc0,1的所有差分通道
//但每次也仅能一个通道进行转换
////////////////////////////////////
//函数名:ADC_Init
//功 能:adc初始化
//说 明:adc 模块端口号,在单端模式下代表 ADC0,在差分模式下代表ADC0,ADC1
// diff 测量模式选择,0 代表单端,1 代表差分
// mode 转换精度选择,填写8,10,12,16 这四个数中的一个
// channel 转换的通道选择,在单端模式下仅开启adc0的4,5,6,7通道的引脚,
// 在差分模式下可以开启adc0,1的所有差分通道
///////////////////////////////////
void ADC_Init(ADC_Type *adc,uint8_t diff,uint8_t mode, uint8_t channel)
{
if((uint32_t)adc==ADC0_BASE)
SIM->SCGC6|=SIM_SCGC6_ADC0_MASK;//开启模块时钟,参见官方k10手册270页
else
SIM->SCGC3|=SIM_SCGC3_ADC1_MASK;//开启模块时钟,参见官方k10手册270页
switch(mode)
{
case 8: adc->CFG1&=~(ADC_CFG1_MODE_MASK);
adc->CFG1|=ADC_CFG1_MODE(0); // 配置为8位精度,参见官方k10手册718页
break;
case 10: adc->CFG1&=~(ADC_CFG1_MODE_MASK);
adc->CFG1|=ADC_CFG1_MODE(2); //配置为10位精度,参见官方k10手册718页
break;
case 12: adc->CFG1&=~(ADC_CFG1_MODE_MASK);
adc->CFG1|=ADC_CFG1_MODE(1); //配置为12位精度,参见官方k10手册718页
break;
case 16: adc->CFG1&=~(ADC_CFG1_MODE_MASK);
adc->CFG1|=ADC_CFG1_MODE(3); //配置为16位精度,参见官方k10手册718页
break;
}
if(diff==0)
{
adc->SC1[A]&=~ADC_SC1_DIFF_MASK; //选择为单端模式,参见官方k10手册717页
SIM->SCGC5|=SIM_SCGC5_PORTE_MASK; //开启port口的模块时钟,详见k10手册268页;
if(channel<=26)
{
PORTE->PCR[(channel+12)]&=~(PORT_PCR_MUX_MASK);
PORTE->PCR[(channel+12)]|=PORT_PCR_MUX(0); //配置io口为adc通道,详见k10手册238页;
}
}
else
adc->SC1[A]|=ADC_SC1_DIFF_MASK; //选择为差分模式,参见官方k10手册717页
}
////////////////////////////////////
//函数名: ADC_Get
//功 能: 进行一个ad转换
//说 明:adc 模块端口号,在单端模式下代表 ADC0,在差分模式下代表ADC0,ADC1
// channel 转换的通道选择,在单端模式下仅开启adc0的4,5,6,7通道的引脚,
// 在差分模式下可以开启adc0,1的所有差分通道,其中DP引脚接高电平,DM引脚接低电平
// 注意:此函数仅返回一个16位的二进制数,在差分模式下用户需要自己编写数据转换程序
///////////////////////////////////
uint16_t ADC_Get(ADC_Type *adc,uint8_t channel)
{
if(channel>26) return 0; //Channel输入无效则直接返值
adc->SC1[A]&=~(ADC_SC1_ADCH_MASK);
adc->SC1[A]|=ADC_SC1_ADCH(channel); //选择通道,参见官方k10手册717页
while((adc->SC1[A]&ADC_SC1_COCO_MASK) == 0x00);//等待转换完成
return adc->R[A];
}
//调用内部温度
//返回温度值 比如26.5° 返回265
uint16_t ADC_Temp()
{
float vtemp;
float temp;
unsigned int value;
// ADC_Init(ADC0,0,16,26);
value=ADC_Get(ADC0,26);
//以下为复制DEMO的公式
//return value;
vtemp=((float)value/65535)*3.3;
if(vtemp>=.7012)
{
temp=(vtemp-.7012)/.001646;
}
else
{
temp=(vtemp-.7012)/.001769;
}
temp=25-temp;
temp*=10; //扩大十倍
return ((uint16_t)temp);
}
#ifndef __adc_h__
#define __adc_h__
//1 头文件
#include <MK10DZ10.H>
//********************************************************************************
//本程序只供学习使用 祝愿每一个参加智能车比赛的队伍都有出色发挥!
//硬件 :超核电子K10 核心板
//目标芯片:K10N512VLL10
//作者 :YANDLD 中国石油大学(华东)
//修改日期:2012/1/5
//版本:V1.0
//Copyright(C) YANDLD 2012-2022
//All rights reserved
//********************************************************************************
#define A 0
#define B 1
//3 函数体
////////////////////////////
//开启adc0或1,默认使用a通道即软件触发,配置时钟源为bus clock,不分频,
//转换速度正常,参考电压选择外部电压,配置为软件触发转换 (大部分为默认值)
//并进行了校准。这里在单端模式下仅开启adc0的4,5,6,7通道的引脚,
//在差分模式下可以开启adc0,1的所有差分通道
//但每次也仅能一个通道进行转换
////////////////////////////////////
////////////////////////////////////
//函数名:ADC_Init
//功 能:adc初始化
//说 明:adc 模块端口号,在单端模式下代表 ADC0,在差分模式下代表ADC0,ADC1
// diff 测量模式选择,0 代表单端,1 代表差分
// mode 转换精度选择,填写8,10,12,16 这四个数中的一个
// channel 转换的通道选择,在单端模式下仅开启adc0的4,5,6,7通道的引脚,
// 在差分模式下可以开启adc0,1的所有差分通道
///////////////////////////////////
void ADC_Init(ADC_Type *adc,uint8_t diff,uint8_t mode, uint8_t channel);
////////////////////////////////////
//函数名: ADC_Get
//功 能: 进行一个ad转换
//说 明:adc 模块端口号,在单端模式下代表 ADC0,在差分模式下代表ADC0,ADC1
// channel 转换的通道选择,在单端模式下仅开启adc0的4,5,6,7通道的引脚,
// 在差分模式下可以开启adc0,1的所有差分通道
// 注意:此函数仅返回一个16位的二进制数,在差分模式下用户需要自己编写数据转换程序
///////////////////////////////////
uint16_t ADC_Get(ADC_Type *adc,uint8_t channel);
#endif
展开阅读全文