STM8多通道ADC采集项目教程与案例分析

版权申诉
0 下载量 101 浏览量 更新于2024-10-04 收藏 11KB ZIP 举报
资源摘要信息:"AutoLight_STM8S003_***.zip_STM8多通道ADC_STM8多通道ADC采集_stm8s ad" 在探讨如何从给定文件中提取相关知识点之前,我们首先需要明确文件标题、描述、标签以及压缩包内的文件名称所指代的内容。本压缩包文件名为“AutoLight_STM8S003_***”,标题中提及“STM8多通道ADC”,描述中提到“stm8多通道ADC采集”,使用了“单片机轮询法”这一项目实现方式。标签则将这些关键词进行了总结,包括“stm8多通道adc”,“stm8多通道adc采集”,“stm8s_adc”,“stm8s003_adc”和“单片机轮询”。以下是对这些知识点的详细说明。 1. **STM8单片机系列** STM8是STMicroelectronics(意法半导体)生产的一系列8位微控制器。它们常用于嵌入式系统的开发,拥有不同的型号和配置,提供给开发者根据需求选择。STM8单片机因为其较低的成本和丰富的功能,被广泛应用于工业控制、汽车电子、消费产品等领域。 2. **STM8多通道ADC** 模拟数字转换器(ADC)是微控制器中常见的功能模块,它能够将模拟信号转换成数字信号,使得单片机可以处理这些数据。STM8系列单片机通常内置有多个ADC通道,这意味着它们能够同时采集来自多个不同输入源的模拟信号。 3. **多通道ADC采集** 多通道ADC采集涉及到的主要是同时读取多个模拟输入信号,并将这些信号转换为单片机可以处理的数字信号。在本文件中,可能描述了如何使用STM8系列单片机的多通道ADC功能进行数据采集,这涉及到如何配置ADC,设置适当的采样速率和分辨率,以及如何处理来自不同通道的数据。 4. **单片机轮询法** 轮询是一种软件控制流程,用于查询多个设备或传感器的状态。在单片机编程中,轮询法通常指的是不断检查(轮询)各个输入信号源,以确定它们是否需要处理。在文件描述中提到的“单片机轮询法”意味着通过编写程序,使STM8单片机定期检查每个ADC通道的状态,当某个通道有信号输入时,就对其进行处理。这是一种简单但是效率不是最高的数据采集方法,尤其在需要同时处理多个通道数据时。 5. **项目参考价值** 文件描述中强调了该项目“绝对有参考和借鉴的价值”,这可能意味着该资源包含了详细的说明、代码示例、配置步骤或者硬件连接方法,对于其他工程师或者学生来说,它们可以从中学习到如何在STM8单片机上实现多通道ADC的采集,并使用单片机轮询法进行数据处理。 6. **文件内可能包含的内容** 根据文件名“AutoLight_STM8S003_***”,我们推测该压缩包可能包含了与STM8S003型号单片机相关的项目文件。这个项目可能是专门用于自动灯光控制系统,其中的日期标识“***”可能代表了项目的建立或最后更新日期。 结合以上知识点,我们可以得出结论,这个压缩包文件对于学习STM8单片机的多通道ADC采集项目具有很高的参考价值,特别是对于那些希望了解如何使用STM8单片机进行多通道模拟信号采集、并希望通过单片机编程进行数据分析的工程师和爱好者。通过分析和学习这个项目,用户可以掌握如何利用STM8单片机的ADC模块实现高效的数据采集,并通过编程实现对多个通道数据的实时监测和处理。
2015-06-08 上传
/*************** 深圳市赛亿科技开发有限公司 ******************** * 文件名 : adc * 描述 :多通道AD采集(源文件) * 实验平台 :STM8S105开发板 * 库版本 :V1.0 * 作者 :hcr * QQ :630054913 * 修改时间 :2014-9-20 *******************************************************************************/ #include "adc.h" u16 AdcData_Buff[10]; //AD采集缓存 u16 AdcValue_Channel1; //通道1值 u16 AdcValue_Channel2; //通道2值 u16 AdcValue_Channel3; //通道3值 float Adc_V1; //通道1值电压值 float Adc_V2; //通道2值电压值 float Adc_V3; //通道3值电压值 /************************************************************************** * 函数名:Adc_Task(void) * 描述 :AD不通通道选择 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :10ms调用 *************************************************************************/ void Adc_Task(void) { static u8 Adc_Channel = 1; static u8 Adc_Timer = 0; static u16 Adc_GetValue; switch(Adc_Channel)//通道选择 { case 1: //通道1 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel1=AdcData_Buff[5]; //取中间值 Adc_V1 = (3.28*AdcValue_Channel1)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 2; //另一通道 AdcChannel_Start(ADC1_CHANNEL_2); //ADC,通道2启动 } break; case 2: //通道2 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel2=AdcData_Buff[5]; //取中间值 Adc_V2 = (3.28*AdcValue_Channel2)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 3; //另一通道 AdcChannel_Start(ADC1_CHANNEL_3); //ADC,通道3启动 } break; case 3: //通道3 Adc_GetValue = ADC1_GetConversionValue(); //获取ADC转换数 AdcData_Buff[Adc_Timer]=Adc_GetValue; //保存采样值 if(Adc_Timer8) { Adc_Timer = 0; //复位 Temp_Choose(); //冒泡法求中间值 AdcValue_Channel3=AdcData_Buff[5]; //取中间值 Adc_V3 = (3.28*AdcValue_Channel3)/1023; //算出实际电压 AdcData_Clean(); //清除缓存数据 Adc_Channel = 1; //另一通道 AdcChannel_Start(ADC1_CHANNEL_1); //ADC,通道1启动 } break; default: break; } } /************************************************************************** * 函数名:ADC_Init(void) * 描述 :ADC1初始化 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :系统初始化调用 *************************************************************************/ void ADC_Init(void) { ADC1_DeInit(); //恢复ADC1寄存器为默认值 ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2); //预分频2 ADC1_ITConfig(ADC1_IT_EOCIE,DISABLE); //使能中断 ADC1_Cmd(ENABLE); //启动ADC AdcChannel_Start(ADC1_CHANNEL_1); /* //恢复ADC1寄存器为默认值 ADC1->CSR = 0x00; ADC1->CR1 = 0x00; ADC1->CR2 = 0x00; ADC1->CR3 = 0x00; ADC1->TDRH = 0x00; ADC1->TDRL = 0x00; ADC1->HTRH = 0x03; ADC1->HTRL = 0xFF; ADC1->LTRH = 0x00; ADC1->LTRL = 0x00; ADC1->AWCRH = 0x00; ADC1->AWCRL = 0x00; ADC1->CR1 |= ADC1_PRESSEL_FCPU_D2; //选择2分频 ADC1->CR2 |= ADC1_ALIGN_RIGHT; //右对齐 ADC1->CR1 |= ADC1_CR1_CONT; //连续转换模式 ADC1->CSR |= ADC1_IT_EOCIE; //使能中断 ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC */ } /************************************************************************** * 函数名:AdcChannel_Start(void) * 描述 :选择通道启动 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void AdcChannel_Start(ADC1_Channel_TypeDef ADC1_Channel) { ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_Channel,ADC1_ALIGN_RIGHT);/*配置通道的转换功能,连续右对齐*/ ADC1_StartConversion();//启动转换 /* ADC1->CSR &= (uint8_t)(~0x0F); // Clear the ADC1 channels ADC1->CSR |= ADC1_Channel; // Select the ADC1 channel ADC1->CR1 |= ADC1_CR1_ADON; //启动ADC */ } /************************************************************************** * 函数名:AdcData_Clean(void) * 描述 :清除缓存数据 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void AdcData_Clean(void) { u8 j; for(j=0;j<10;j++) AdcData_Buff[j]=0; } /************************************************************************** * 函数名:Temp_Choose(void) * 描述 :冒泡法取中间值 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :外部调用 *************************************************************************/ void Temp_Choose(void)//冒泡法求中间值 { u8 i_Adc = 0; u8 j_Adc = 0; u16 Data_Buf; for(j_Adc=0;j_Adc<9;j_Adc++) { for(i_Adc=0;i_AdcAdcData_Buff[i_Adc+1]) { Data_Buf=AdcData_Buff[i_Adc]; AdcData_Buff[i_Adc]=AdcData_Buff[i_Adc+1]; AdcData_Buff[i_Adc+1]=Data_Buf; } } } }