的stm32adc通道配置怎么改

其他(27)
.cn/s/blog_6b60f36a01010x8z.html
转:经典STM32 ADC多通道转换
STM32 ADC多通道转换
描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。
程序如下:
#i nclude &stm32f10x.h& //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义
#i nclude &eval.h& //头文件(包括串口、按键、LED的函数声明)
#i nclude &SysTickDelay.h&
#i nclude &UART_INTERFACE.h&
#i nclude &stdio.h&
#define N 50 //每通道采50次
#define M 12 //为12个通道
vu16 AD_Value[N][M]; //用来存放ADC转换结果,也是DMA的目标地址
vu16 After_filter[M]; //用来存放求平均值之后的结果
void GPIO_Configuration(void)
GPIO_InitTypeDef GPIO_InitS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //因为USART1管脚是以复用的形式接到GPIO口上的,所以使用复用推挽式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA0/1/2 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB0/1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PC0/1/2/3/4/5 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
void RCC_Configuration(void)
ErrorStatus HSEStartUpS
RCC_DeInit(); //RCC 系统复位
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE准备好
if(HSEStartUpStatus == SUCCESS)
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles
RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72 MHz
RCC_PLLCmd(ENABLE); //Enable PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
| RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //使能ADC1通道时钟,各个管脚时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC最大时间不能超过14M
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
void ADC1_Configuration(void)
ADC_InitTypeDef ADC_InitS
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_I //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode =ENABLE; //模数转换工作在扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //模数转换工作在连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N //外部触发转换关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = M; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
//ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 5, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 6, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 8, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 9, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 10, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 11, ADC_SampleTime_239Cycles5 );
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 12, ADC_SampleTime_239Cycles5 );
// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //复位指定的ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1复位校准寄存器的状态,设置状态则等待
ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
void DMA_Configuration(void)
DMA_InitTypeDef DMA_InitS
DMA_DeInit(DMA1_Channel1); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1-&DR; //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_V //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //内存作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = N*M; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW //数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW //数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_C //工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_H //DMA通道 x拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_D //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道
//配置所有外设
void Init_All_Periph(void)
RCC_Configuration();
GPIO_Configuration();
ADC1_Configuration();
DMA_Configuration();
//USART1_Configuration();
USART_Configuration(9600);
u16 GetVolt(u16 advalue)
return (u16)(advalue * 330 / 4096); //求的结果扩大了100倍,方便下面求出小数
void filter(void)
int sum = 0;
for(i=0;i&12;i++)
for ( count=0;count&N;count++)
sum += AD_Value[count][i];
After_filter[i]=sum/N;
int main(void)
u16 value[M];
init_All_Periph();
SysTick_Initaize();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待传输完成否则第一位数据容易丢失
for(i=0;i&12;i++)
value[i]= GetVolt(After_filter[i]);
printf(&value[%d]:\t%d.%dv\n&,i,value[i]/100,value[i]0) ;
delay_ms(100);
该程序中的两个宏定义,M和N,分别代表有多少个通道,每个通道转换多少次,可以修改其值。
曾出现的问题:配置时钟时要知道外部晶振是多少,以便准确配置时钟。将转换值由二进制转换为十进制时,要先扩大100倍,方便显示小数。最后串口输出时在 printf语句之前加这句代码,防止输出的第一位数据丢失:while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:58757次
积分:1409
积分:1409
排名:千里之外
原创:63篇
转载:119篇
(10)(2)(18)(22)(56)(12)(1)(1)(6)(4)(23)(2)(8)(14)(6)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'新版本cube MX 如何设置多通道ADC采样 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 4383|回复: 17
新版本cube MX 如何设置多通道ADC采样
在线时间21 小时
主题帖子好友
初级会员, 积分 184, 距离下一级还需 16 积分
初级会员, 积分 184, 距离下一级还需 16 积分
cube MX 新版本 V4.12.0,进入ADC设计界面后和网上看到的范例有差别,没有多通道设置了?不知道如何下手?
cube set.jpg (97.2 KB, 下载次数: 7)
10:19 上传
在线时间15 小时
主题帖子好友
初级会员, 积分 126, 距离下一级还需 74 积分
初级会员, 积分 126, 距离下一级还需 74 积分
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
&&/* Get the converted value of regular channel */
&&uwADCxConvertedValue = HAL_ADC_GetValue(AdcHandle);
&&HAL_ADC_Stop_IT(&hadc);
& && &&&if(CH_dp==0)
& && && && && & CH_dp=1;
& && && && && & ADC1-&CHSELR = ADC_CHANNEL_2;
& && &&&else
& && && && && & CH_dp=0;
& && && && && & ADC1-&CHSELR = ADC_CHANNEL_7;& && && && && && && && && && &&&
& && && && && && && && &
& && &&&HAL_ADC_Start_IT(&hadc);
&&HAL_UART_Transmit_IT(&huart1, (uint8_t*)uwADCxConvertedValue, 4);
在线时间14 小时
主题帖子好友
中级会员, 积分 234, 距离下一级还需 266 积分
中级会员, 积分 234, 距离下一级还需 266 积分
本帖最后由 稀饭放姜 于
16:06 编辑
在STM32F系列ADC采用DMA好像可以这样配置,STM32L051好像没法配置多通道,你可以试试,不知道是不是我的 ...
怎么可能删除用户写的程序,你写的程序要单独放到一个文件夹里的,为什么要和cubemx的代码混合呢?
CUBEMX的逻辑就是利用HAL库和中间件隔离你对底层的操作。你使用STMCU的所有资源基本上都在自带的src和inc目录里的文件操作。这些是ST提供的外设配置环境。
你要写的功能肯定都是控制逻辑和算法之类,这些肯定是单独建一个目录,这样才是松耦合。你如何配置都不会删除你额外的文件的。
网上很多公司出的HAL库的使用方法,都是标准库的思想,如果用这种思想去使用HAL库,会累死人的。
在线时间1 小时
主题帖子好友
新手上路, 积分 16, 距离下一级还需 34 积分
新手上路, 积分 16, 距离下一级还需 34 积分
配置多通道最好使用DMA,
启动DMA同时就是启动多通道采集。你配置好工程后会自动配置通道的
HAL_ADC_Start_DMA(&hadc,ADC_ConvertedValue,2)
这里面ADC_ConvertedValue是一个数组,后面的2代表两通道,是你自己定义的。
HAL_ADC_ConvCpltCallback里面要注意,可以按照楼上给的示例做测试(我在测试时里面如果没有配置好就会死在DMA中断里)。
另外你说的回自动清除你写的代码,要注意在
以下位置写入(以main中的USER CODE BEGIN 3为例),
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
还有,做开发心态很重要,抱怨HAL库的时候多想想实现原理,你会有更多收获。
在线时间424 小时
ST金币2436
主题帖子好友
ADC的界面设置F0、F1、F3、F4 都不完全相同
看似你这个应该是F0或F1的ADC配置
在线时间21 小时
主题帖子好友
初级会员, 积分 184, 距离下一级还需 16 积分
初级会员, 积分 184, 距离下一级还需 16 积分
L0的设置界面
在线时间860 小时
主题帖子好友
看你是开了DMA 了,你开几个ADC通道 Cube会自动配置通道的。。。无需再设置。。和F0的一样。。。
在线时间21 小时
主题帖子好友
初级会员, 积分 184, 距离下一级还需 16 积分
初级会员, 积分 184, 距离下一级还需 16 积分
看你是开了DMA 了,你开几个ADC通道 Cube会自动配置通道的。。。无需再设置。。和F0的一样。。。
:lovelin ...
在哪里打开几个ADC通道?我只能看到配置几个通道的ADC输入引脚。其他不知道在哪里配置多通道,我试了实际生成的ADC初始化里只配置了最后的通道,而且没有加校准程序和用户代码区,想自己加程序每次重新生成又会清掉自己写的代码,Cube MX越用越郁闷。
在线时间424 小时
ST金币2436
主题帖子好友
在哪里打开几个ADC通道?我只能看到配置几个通道的ADC输入引脚。其他不知道在哪里配置多通道,我试了实际 ...
拷贝出来单独管理
在线时间202 小时
ST金币1471
主题帖子好友
金牌会员, 积分 3234, 距离下一级还需 1766 积分
金牌会员, 积分 3234, 距离下一级还需 1766 积分
在线时间21 小时
主题帖子好友
初级会员, 积分 184, 距离下一级还需 16 积分
初级会员, 积分 184, 距离下一级还需 16 积分
拷贝出来单独管理
看来只有这个笨办法了,这样做也有很大风险,替换来替换去,最后要是最后编译的都是残缺的文件没有被发现就麻烦了。
在线时间21 小时
主题帖子好友
初级会员, 积分 184, 距离下一级还需 16 积分
初级会员, 积分 184, 距离下一级还需 16 积分
自作聪明的CUBE MX,我用的真是生不如死。就跟win8与XP系统一样,表面看起高大上,实际上是喷了香水的一坨屎。
最郁闷的是STM32L0还没标准库用。
站长推荐 /1
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by21ic官方微信-->
后使用快捷导航没有帐号?
ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
请完成以下验证码
查看: 2677|回复: 2
STM32F0 ADC多通道数据采集修改库函数问题
&&已结帖(20)
主题帖子积分
助理工程师, 积分 1498, 距离下一级还需 502 积分
助理工程师, 积分 1498, 距离下一级还需 502 积分
主题帖子积分
专家等级:结帖率:93%
主题帖子积分
助理工程师, 积分 1498, 距离下一级还需 502 积分
助理工程师, 积分 1498, 距离下一级还需 502 积分
&&实现两个通道的数据的采集通道3和通道5,把采集到的数据分别通过USART发送
一直只能实现单通道的数据采集,双通道的时候采集数据不准确,查看库函数
void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime)
&&uint32_t tmpreg = 0;
&&/* Check the parameters */
&&assert_param(IS_ADC_ALL_PERIPH(ADCx));
&&assert_param(IS_ADC_CHANNEL(ADC_Channel));
&&assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));
&&/* Configure the ADC Channel */
&&ADCx-&CHSELR |= (uint32_t)ADC_C
&&/* Clear the Sampling time Selection bits */
&&tmpreg &= ~ADC_SMPR1_SMPR;
&&/* Set the ADC Sampling Time register */
&&tmpreg |= (uint32_t)ADC_SampleT
&&/* Configure the ADC Sample time register */
&&ADCx-&SMPR =
&&ADCx-&CHSELR |= (uint32_t)ADC_C
这句话看起来会将通道累加,就是说当设置通道3后,再去设置通道5的话,那ADC就设置了2个通道,从而扫描数据的时候可能会出现问题
所以我把这句改为ADCx-&CHSELR = (uint32_t)ADC_C&&后采集双通道的数据就OK了
我不想改库函数,有没有什么办法能让ADC停止当前通道的设置啊?谢谢各位大侠!
满意回复+20
库函数是正确的, 通过 ADCx->CHSELR |= (uint32_t)ADC_C
这个方式, 增加了 ADC_Channel 通道.
这句改为ADCx->CHSELR = (uint32_t)ADC_C
那么原 ...
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:58.00
主题帖子积分
---------------------
库函数是正确的, 通过 ADCx-&CHSELR |= (uint32_t)ADC_C
这个方式, 增加了 ADC_Channel 通道.
这句改为ADCx-&CHSELR = (uint32_t)ADC_C&&那么原来设置的通道就被取消了!
你的问题应该就不是 库函数的问题!
欢迎进入 !
主题帖子积分
中级工程师, 积分 4929, 距离下一级还需 71 积分
中级工程师, 积分 4929, 距离下一级还需 71 积分
主题帖子积分
专家等级:结帖率:84%
主题帖子积分
中级工程师, 积分 4929, 距离下一级还需 71 积分
中级工程师, 积分 4929, 距离下一级还需 71 积分
F0只有一个ADC核,如果多通道轮流采集就有些缓;我也正为这事头痛呢;
爱你一万年
欢快之小溪
发帖类勋章
时间类勋章
社区建设奖章
等级类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
技术高手奖章
人才类勋章
沉静之湖泊
发帖类勋章
突出贡献奖章
等级类勋章STM32多通道ADC规则转换实现
ADC_RCVTab[160]
;&&&//自己添加
int main(void)
#ifdef DEBUG
& debug();
& RCC_Configuration();
& NVIC_Configuration();
& GPIO_Configuration();
& LcdShow_Init();
& RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,
ENABLE);//使能DMA时钟
& DMA_DeInit(DMA1_Channel1);
& DMA_InitStructure.DMA_PeripheralBaseAddr =
ADC1_DR_A//外设地址
& DMA_InitStructure.DMA_MemoryBaseAddr =
(u32)ADC_RCVT//内存地址
& DMA_InitStructure.DMA_DIR =
DMA_DIR_PeripheralSRC;//dma传输方向单向
& DMA_InitStructure.DMA_BufferSize
=&160;//设置DMA在传输时缓冲区的长度
& DMA_InitStructure.DMA_PeripheralInc =
DMA_PeripheralInc_D//设置DMA的外设递增模式,一个外设
& DMA_InitStructure.DMA_MemoryInc =
DMA_MemoryInc_E//设置DMA的内存递增模式,
& DMA_InitStructure.DMA_PeripheralDataSize =
DMA_PeripheralDataSize_HalfW//外设数据字长
& DMA_InitStructure.DMA_MemoryDataSize =
DMA_MemoryDataSize_HalfW//内存数据字长
& DMA_InitStructure.DMA_Mode =
DMA_Mode_C//设置DMA的传输模式:连续不断的循环模式
& DMA_InitStructure.DMA_Priority =
DMA_Priority_H//设置DMA的优先级别
& DMA_InitStructure.DMA_M2M =
DMA_M2M_D//设置DMA的2个memory中的变量互相访问
& DMA_Init(DMA1_Channel1,
&DMA_InitStructure);
& DMA_Cmd(DMA1_Channel1, ENABLE);
& ADC_InitStructure.ADC_Mode =
ADC_Mode_I//独立工作模式
& ADC_InitStructure.ADC_ScanConvMode =
ENABLE;//扫描方式
& ADC_InitStructure.ADC_ContinuousConvMode =
ENABLE;//连续转换
& ADC_InitStructure.ADC_ExternalTrigConv =
ADC_ExternalTrigConv_N//外部触发禁止
& ADC_InitStructure.ADC_DataAlign =
ADC_DataAlign_R//数据右对齐
& ADC_InitStructure.ADC_NbrOfChannel =
8;//用于转换的通道数
& ADC_Init(ADC1,
&ADC_InitStructure);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_8 ,
1, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_9 ,
2, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_10,
3, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_11,
ADC_SampleTime_239Cycles5);&&
& ADC_RegularChannelConfig(ADC1, ADC_Channel_12,
5, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_13,
6, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_14,
7, ADC_SampleTime_239Cycles5);
& ADC_RegularChannelConfig(ADC1, ADC_Channel_15,
8, ADC_SampleTime_239Cycles5);&
& ADC_DMACmd(ADC1, ENABLE);
& ADC_Cmd(ADC1, ENABLE);&
& ADC_ResetCalibration(ADC1);
& while(ADC_GetResetCalibrationStatus(ADC1));
& ADC_StartCalibration(ADC1);
& while(ADC_GetCalibrationStatus(ADC1));
& ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(RESET==DMA_GetFlagStatus(DMA1_FLAG_TC1));&&
//自己添加
&&& vu16 value1
&&& vu16 value2
&&& vu16 value3
&&& vu16 value4
&&& vu16 value5
&&& vu16 value6
&&& vu16 value7
&&& vu16 value8
&value1 = average(ADC_RCVTab,0);
average(ADC_RCVTab,1);&
&value3 = average(ADC_RCVTab,2);
&value4 = average(ADC_RCVTab,3);
&value5 = average(ADC_RCVTab,4);
average(ADC_RCVTab,5);&
&value7 = average(ADC_RCVTab,6);
average(ADC_RCVTab,7);&
&&& u8 num1 =
value3 % 10;
&&& u8 num2 =
(value3 / 10) % 10;
&&& u8 num3=
(value3 / 100) % 10;
&&& u8 num4 =
value3 / 1000;
&&& if (num1
display[3] = num1 + (65 - 10);
display[3] = num1 + (48-0);
&&& if (num2
display[2] = num2 +(65 - 10);
display[2] = num2 + (48 - 0);
display[1]=num3+(65-10);
display[1]=num3+(48-0);
display[0]=num4+(65-10);
display[0]=num4+(48-0);
write_string(display);
u16 average(vu16 ADCDataTab[], u16
nChannel)&&&&
//自己添加
&& u16 averagevalue=0,
maxvalue=0, minvalue=0xFFFF,
(i=0;i&20;i++)&
averagevalue += *(ADCDataTab+nChannel+i*8);
if(*(ADCDataTab+nChannel+i*8)&maxvalue)&&&
& maxvalue=*(ADCDataTab+nChannel+i*8);
if(*(ADCDataTab+nChannel+i*8)&minvalue)
& minvalue=*(ADCDataTab+nChannel+i*8);
((averagevalue-maxvalue-minvalue)/18);&&&//这样会耗时不可取
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 stm32 adc多通道 的文章

 

随机推荐