专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
ADC的多通道采样LCD显示
2019-07-15 10:16
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
4555
6
1328
ADC双通道,DMA传输,但是不知道怎么编写在LCD上显示双路采样的值,
在网上搜过很多程序,都是通过串口打印的。求助,怎么编写?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
2017fgl
2019-07-15 23:41
人中狼 发表于 2017-7-11 18:55
最好是把程序贴出来,或者是把显示那部分贴出来,还有LCD是什么型号的
#include "adc.h"
__IO uint16_t ADC_ConvertedValue[3];//分别存储AD三个通道的采样值
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE );
//配置外设AD对应IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC , &GPIO_InitStructure);
DMA_DeInit(DMA1_Channel1);//ADC1对应的DMA通道数
DMA_Initstructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设AD的地址数据寄存器地址,数据手册上有
DMA_Initstructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;//内存地址,就是你想要把采样值存在那个变量的地址
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//方向(从外设到内存)
DMA_Initstructure.DMA_BufferSize = 3;//几个通道,几个开辟连续的DMA存储单元
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设地址不变
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//内存地址自增,因为3个通道嘛
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;//设置外设数据长度为半字,即16位
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//设置DMA存储数据长度为半字,即16位
DMA_Initstructure.DMA_Mode = DMA_Mode_Circular ;//循环模式
DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh ;//优先级
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable ;
DMA_Init(DMA1_Channel1 , &DMA_Initstructure );
DMA_Cmd(DMA1_Channel1 , ENABLE );
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;//独立模式,不是多个AD共用一个通道
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//开启扫描模式,针对多通道时
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3;//打来的ADC通道数目
ADC_Init(ADC1, &ADC_InitStructure );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟,为PCLK2的6分频,即12Mhz
ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_1Cycles5 );//设置AD采集扫描顺序和采样周期为1.5ADC的时钟周期
ADC_RegularChannelConfig(ADC1 , ADC_Channel_2 , 2 , ADC_SampleTime_1Cycles5 );//所以ADC的转换速率为(1.5+12.5)/12=1.167us
ADC_RegularChannelConfig(ADC1 , ADC_Channel_15 , 3 , ADC_SampleTime_1Cycles5 );
ADC_DMACmd(ADC1 , ENABLE );//使能AD DMA
ADC_Cmd(ADC1 , ENABLE );
//AD校验
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1 , ENABLE );//采用软件触发方式
}
这是别人的代码,这些我都懂,就是不懂怎么再像读取ADC平均值那样把DMA传输得数据在通过程序读取,然后显示出来。
加载中...
查看其它6个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "adc.h"
__IO uint16_t ADC_ConvertedValue[3];//分别存储AD三个通道的采样值
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_Initstructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE );
//配置外设AD对应IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式
GPIO_Init(GPIOA , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC , &GPIO_InitStructure);
DMA_DeInit(DMA1_Channel1);//ADC1对应的DMA通道数
DMA_Initstructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设AD的地址数据寄存器地址,数据手册上有
DMA_Initstructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;//内存地址,就是你想要把采样值存在那个变量的地址
DMA_Initstructure.DMA_DIR = DMA_DIR_PeripheralSRC ;//方向(从外设到内存)
DMA_Initstructure.DMA_BufferSize = 3;//几个通道,几个开辟连续的DMA存储单元
DMA_Initstructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable ;//外设地址不变
DMA_Initstructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//内存地址自增,因为3个通道嘛
DMA_Initstructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ;//设置外设数据长度为半字,即16位
DMA_Initstructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;//设置DMA存储数据长度为半字,即16位
DMA_Initstructure.DMA_Mode = DMA_Mode_Circular ;//循环模式
DMA_Initstructure.DMA_Priority = DMA_Priority_VeryHigh ;//优先级
DMA_Initstructure.DMA_M2M = DMA_M2M_Disable ;
DMA_Init(DMA1_Channel1 , &DMA_Initstructure );
DMA_Cmd(DMA1_Channel1 , ENABLE );
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent ;//独立模式,不是多个AD共用一个通道
ADC_InitStructure.ADC_ScanConvMode = ENABLE ;//开启扫描模式,针对多通道时
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE ;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None ;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right ;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3;//打来的ADC通道数目
ADC_Init(ADC1, &ADC_InitStructure );
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟,为PCLK2的6分频,即12Mhz
ADC_RegularChannelConfig(ADC1 , ADC_Channel_1 , 1 , ADC_SampleTime_1Cycles5 );//设置AD采集扫描顺序和采样周期为1.5ADC的时钟周期
ADC_RegularChannelConfig(ADC1 , ADC_Channel_2 , 2 , ADC_SampleTime_1Cycles5 );//所以ADC的转换速率为(1.5+12.5)/12=1.167us
ADC_RegularChannelConfig(ADC1 , ADC_Channel_15 , 3 , ADC_SampleTime_1Cycles5 );
ADC_DMACmd(ADC1 , ENABLE );//使能AD DMA
ADC_Cmd(ADC1 , ENABLE );
//AD校验
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1 , ENABLE );//采用软件触发方式
}
这是别人的代码,这些我都懂,就是不懂怎么再像读取ADC平均值那样把DMA传输得数据在通过程序读取,然后显示出来。
一周热门 更多>