今天在使用stm8s单片机的AD功能,单片机上有AN0到AN9十个通道。想只用其中的三路AN5到AN7。
//ADC初始化
void ADC_Init(void)
{
ADC_CR1 = 0x50;
ADC_CR2 = 0x38;
ADC_TDRL = 0xE0; //禁止施密特触发
}
unsigned int Read_ADC_Temp(unsigned channel)
{
unsigned int i,ADtemp;
ADC_Init();
//ADC_CSR = 0x00;
ADC_CSR = channel;
ADC_CR1 = 0x01; // CR1寄存器的最低位置1,使能ADC转换
for(i = 0;i < 300;i ++); // 延时一段时间,至少7uS,保证ADC模块的上电完成
ADC_CR1 = ADC_CR1 | 0x01; // 再次将CR1寄存器的最低位置1
// 使能ADC转换
while(!(0x80&ADC_CSR)); // 等待ADC结束
ADtemp = (unsigned int)(ADC_DRH<<8) | ADC_DRL;
ADC_CR1 = 0x00;
return ADtemp;
}
当单独使用某个通道时
adtemp = read_a2d_dis(0x07);
printf("%d ",adtemp);
读出的数值是正确的。接地是0接到VDDA上是1023。
但是
adtemp = read_a2d_dis(0x07);
adtemp1 = read_a2d_dis(0x06);
printf("%d ",adtemp);
printf("%d ",adtemp1);
切换通道后,读出的数据不对,接到地时分别是768,254。切换通道后重新初始化也不行。一开始以为是每次采样读玩数据后应该延时。后来在读取数据的时候分别延时1S还是不行。测得硬件的电压也是正确的。datasheet上设置的也都对的。后来无奈,就多读几次,看看结果是不是一样。
后来发现只要在同一个通道连续读两次。取出的结果是正确的。
unsigned int read_a2d_dis(unsigned char channel)
{
unsigned int tempTab[5];
unsigned int i,j,temp;
temp = 0;
for(i = 0;i < 5;i ++)
{
tempTab[i] = Read_ADC_Temp(channel);
}
for(j=0;j<5;j++)
{
for (i=0;i<5-j;i++)
{
if (tempTab[i]>tempTab[i+1])
{
temp=tempTab[i];
tempTab[i]=tempTab[i+1];
tempTab[i+1]=temp;
}
}
}
return tempTab[2];
}
做了如上修改后,一共读五个数据,取中位数。才养值没有问题,但是为什么必须在切换通道的时候要读两次才能得到正确的数据依然没有找到答案。只是怀疑是否是切换通道后,单片机将数据存储到ADC_DRH,和ADC_DRL里时移位寄存器发生了错位。只能在以后慢慢寻找答案。
关键字:stm8s 单片机 多通道转换
引用地址:
stm8s单片机实现多通道转换
推荐阅读最新更新时间:2024-03-16 16:02
基于AT89C51单片机无线收发控制的交通信号灯模型
引言 随着我国经济的高速发展,人们对私家车、公交车的需求越来越大。相应地,我国进入WTO以后,我国经济贸易与世界接轨,汽车业关税大大降低,使很多人都能负担得起,买私家车不再是梦想。但是,私家车、公交车的大增无疑会对我国交通系统带来沉重的压力。放眼现在的中国,如广州、香港、上海等大都市,无不受到交通堵塞的困扰。中国要发展,交通事业决不能停步不前。有及于此,我国交通管制系统应当以人性化、智能化为目的,作出相应的改善。本论文正是以此为出发点,对单片机控制的交通信号灯模型作了较详尽的介绍。 单片机无线收发控制的交通信号灯模型可以分为电源电路、单片机主控电路、无线收发控制电路和显示电路四部分组成,组成电路如图1: 由于
[单片机]
ADI新款精密模拟微控制器集成了片上数据转换器
Analog Devices, Inc.推出两款高集成度精密模拟微控制器,分别为 ADuC7023 和 ADuC7122。这两款器件集成了片上存储器、数据转换器和众多模拟外设,可提供业界最高水平的可编程性能和最小的封装尺寸。ADuC7023 和 ADuC7122 精密模拟微控制器采用闪存容量高达 126KB 的 ARM7 处理器,可以在基于固定和可调谐频率激光的光收发器和模块应用中实现数字诊断,并能确保精确控制光驱动器和诊断过程。
这两款最新的微控制器集成了片上12位 ADC(模数转换器)和 DAC(数模转换器),与竞争性分立方案相比,这种整体解决方案可减小高达75%的尺寸。ADuC7023 和 ADuC712
[单片机]
TM1637数码管显示STC51单片机驱动程序
/* Coder : Farman Date : 2018-01-02 参考了厂家的TM1637数据手册,在此表示感谢。 */ #include STC89C5XRC.h //包含52单片机头文件 #include Delay.h //////////////////////////////////////////////////////////////////////////// sbit I2C_SCL = P2^1; //定义模拟IIC总线的时钟线 sbit I2C_SDA = P2^0; //定义模拟IIC总线的数据线 #define TM1637_BRIGHTNESS 7 // 0 - 7
[单片机]
单片机内部密码破解方法
1 引言 单片机(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字节,以保护片内程序。如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机内的程序,这就是所谓拷贝保护或者说锁定功能。事实上,这样的保护措施很脆弱,很容易被破解。单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程序。因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量
[单片机]
51单片机栈RAM的关系
51单片机RAM分为四个区域 1.工作寄存器区(00H~1FH) 2.位寻址区(20H~2FH) 3.用户RAM区(30H~7FH) 4.特殊功能寄存器(80H~FFH) 其中1.2.3处于RAM低128单元,4处于高128单元 也就是声明变量时data与idata位置 而栈就是在用户RAM区内人为开辟的一段空间,用于存放数据,而单片机也相应的为这段空间提供了硬件也就是SP寄存器 SP是一个8位寄存器用于存放栈顶位置
[单片机]
如何使用单片机制作一个手动计数器
1.实验任务 利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阴数码管,作为00-99计数的十位数显示;硬件电路图如图19所示。 2.电路原理图 图4.10.1 3.系统板上硬件连线 (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。 (2. 把“单片机系统”区域中的
[单片机]
单片机结构化编程
模块划分的 划 是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求。C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了 相对论), C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明; (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明; (3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明; (4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇
[单片机]
Microchip推出集成微型FPGA的PIC16 微控制器,售价不到 50 美分
编译自EEJOURNAL Microchip 现在提供一款基于闪存的微控制器,集成可编程逻辑块,其售价不到50美分。 Microchip PIC16F13145 系列的九个新产品,与其他型号16F系列采用相同的 8 位 RISC 微处理器架构,但它们还集成了一个新的可编程逻辑块,称为可配置逻辑块 (CLB)。 PIC16F13145 微控制器系列中的器件采用 8、14 和 20 引脚封装,具有 3.5 至 14 KB 闪存和 256 至 1024 字节 RAM。 Microchip PIC1613145 微控制器系列的九个成员具有相同的内部架构,但具有不同数量的 RAM 和闪存,并提供不同的封装,具体取决于您应用的 I/O
[单片机]