学习STM32的ADC转换,在开发板上写程序调试。
四个任务:
四个任务:
1.AD以中断方式(单次)采集一路
2.AD以中断方式连续采集四路
3.ADC多路采集,DMA传输,DMA深度为一级
4.ADC以DMA方式采集四路,每路DMA深度为28级,并滤波,说明滤波原理
总结:
第一个任务
:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_ScanConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),
ADC_InitStructure.ADC_ScanConvMode=DISABLE,为单通道单次模式。
ADC_ContinuousConvMode,定转换是连续还是单次,ADC_ContinuousConvMode=DISABLE
为单次,ADC_NbrOfChangnel规定ADC规则转换的通道数。ADC_NbrOfChannel=1;//开启1个通道数。
ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_55Cycles5);设置指定规则组的通道的采样顺序和转换时间。这里以为只有一路通道,采用的是PC3引脚,对应的通道数是13通道,采样顺序也就是1,。
ADC_Cmd(ADC1,ENABLE);使能ADC
ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);开启ADC转换结束中断。
ADC_ResetCalibration(ADC1);//重置校验寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置校验成功
ADC_StartCalibration(ADC1);//开始ADC校验
while(ADC_GetCalibrationStatus(ADC1));//等待ADC校验好
ADC_SoftwareStartConvCmd(ADC1, ENABLE);//软件触发开始转换
因为ADC有一个16位的规则组数据寄存器(ADC_DR),采用一路转换时可以不用通过DMA传输。这里就没有配置DMA。
void ADC_IRQHandler(void)
{
ADCConvertedValue=ADC_GetConversionValue(ADC1);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}
当一次转换结束,DAC产生中断,在中断函数里,读取ADC_DR寄存器中的值,一定清除中断标志位。
采集出来的数据是16进制数,要经过处理,变成10进制数,具体如下:
(value*100/4096)*33,value是从寄存器读出来的十六进制的数据,经过此变换后就变成10进制数,是个整数,我们通过串口显示的时候要把小树部分也要显示出来则有:((value*100/4096)*33)/1000,整数部分。
((value*100/4096)*33)00/100,((value*100/4096)*33)0/10),小数部分,
串口配置,我是通过STM32上的串口1与PC机通讯的,具体配置如下:
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;波特率9600
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据位
USART_InitStructure.USART_StopBits=USART_StopBits_1;1个停止位
USART_InitStructure.USART_Parity=USART_Parity_No;无奇偶校验
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_Init(USART1,&USART_InitStructure);初始化串口配置
USART_Cmd(USART1,ENABLE);使能串口
}
int fputc(int ch,FILE *f)
{
USART_SendData(USART1, (u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)//检查发送是否完成
{
}
return ch;
}此函数,是把printf输出函数定向到USART。
第一个任务大概就是这个过程,在后面的任务有相同之处,就不重复叙述了。
第二个任务:ADC以中断方式连续采集四路。
首先配置4路模拟输入,我配置的是PC0、PC1、PC2、PC3四个IO口,输入方式为模拟输入,速度采用2M,它们对应的ADC通道分别是10、11、12、13通道。
在第一个任务说了,ADC规则转换多路采样时,ADC的数据寄存器只有一个16位寄存器,所以必须采用DMA来传输数据,DMA配置如下:
DMA_InitStructure.DMA_PeripheralBaseAddr=DR_ADDRESS; //DMA对应的外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&Buf; //内存存储基地址,定义的一个数组
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //DMA转换模式为SRC模式,由外设搬移到内存
DMA_InitStructure.DMA_BufferSize=4; // DMA缓存大小,4个(设置DMA在传输时缓冲区的长度)
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //接收一次数据后,设备地址禁止后移(设置DMA的外设递增模式)
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //关闭接收一次数据后,目标内存地址后移(设置DMA的内存递增模式)
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//定义外设数据长度
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
//循环模式开启,Buf写满后,自动回到初始地址开始传输
DMA_InitStructure.DMA_Priority=DMA_Priority_High;//优先级高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
ADC配置:
//ADC配置
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立转换模式
ADC_InitStructure.ADC_ScanConvMode=ENABLE;//开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//ADC外部开关,关闭状态
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//对齐方式,右对齐方式
ADC_InitStructure.ADC_NbrOfChannel=4;//开启通道数,4个
ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC
ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12,3,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_55Cycles5);;
//ADC通道组,第10、11、12、13个通道,采样顺序分别是1,2,3,4转换时间55.5个周期
ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
ADC_Cmd(ADC1, ENABLE);//打开ADC1
ADC_ResetCalibration(ADC1);//重置ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
ADC_StartCalibration(ADC1);//开始ADC1校准
while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1软件开始转换
中断是采用DMA中断,当DMA第一轮传输结束时,设一个标志位,当标志位为1时,表明第一轮转化和传输完成,此时就可以读取数组中的数据,经过处理就可以通过串口显示出来。
void DMAChannel1_IRQHandler(void)
{
ADC_DMA_OK=1;
DMA_ClearITPendingBit(DMA1_IT_TC1);
}中断函数。
第二个任务大概就这样子。
第三个任务:AD以DMA方式采集一路,DMA深度为一级。
这个任务不难,关键要理解到DMA深度,用自己的语言来理解哈DMA深度吧,当ADC以一路采集时,ADC转换完成就自动把转换结果通过DMA传给目的地址,如果传输一次结束DMA就产生中断的话,DMA的深度就为一级,如果连续传输N次,DMA的深度就位N级,当然这个N是又范围的,因为受目的地址的内存大小控制和数据宽度,这个大家应该豆明白的。
这个任务在第一个任务的基础上我通过DMA传输,意思是AD配置没什么区别。DMA配置和第二个任务的区别就是DMA_BufferSize的宽度不同。
#define DR_ADDRESS (u32)0x4001244c ADC的地址
#define DMA_Count 1 DMA深度,也就是连续传输的次数
#define ADC_Channle 1 ADC通道
数据处理和串口通讯这里不重复叙述。DMA中断和任务二的类似。
第四个任务:AD以DMA方式采集四路,每路DMA深度为128级,并滤波,说明滤波原理。
这个任务和是个综合性任务,只要弄懂前面三个任务,难点是再如何滤波,开始的时候我也不知道怎么滤波,同事提醒我才知道怎么滤波的,我大概说哈我的理解,把四路通道采集的数据分别放到四个数组中,然后给他来个排序,降序,升序都行,把首位两个数丢掉,然后加起来求平均值。但是我这里因为DMA的深度为128级,也就是四个通道分别采样了128次,大家都知道,数据越多,求平均值就越准确,所以我就没有采用什么排序法了,直接给他们分别求平均值,具体如下:
#define DR_ADDRESS (u32)0x4001244c ADC的地址
#define DMA_Count 128 DMA深度,也就是连续传输的次数
#define ADC_Channle 4 ADC通道
for(i=0;i<(ADC_Channle*DMA_Count);i+=4)
{
Value1[j]=Buf[i+0];
Sum1+=Value1[j];
Value2[j]=Buf[i+1];
Sum2+=Value2[j];
Value3[j]=Buf[i+2];
Sum3+=Value3[j];
Value4[j]=Buf[i+3];
Sum4+=Value4[j];
j++;
}
Valu1=Sum1/DMA_Count;
Valu2=Sum2/DMA_Count;
Valu3=Sum3/DMA_Count;
Valu4=Sum4/DMA_Count;
Delay(100000);
printf("rn当前AD_0值:0x%x,电压值:%d.%d%dVnr",
Valu1,((Valu1*100/4096)*33)/1000,((Valu1*100/4096)*33)00/100,((Valu1*100/4096)*33)0/10);
上一篇:教你如何使用stm32发送一帧数据(结构体中的数据)
下一篇:Stm32-SWD下载调试配置
推荐阅读
史海拾趣
Franz Binder GmbH & Co公司的发展故事
故事一:初创与奠基
Franz Binder GmbH & Co公司,简称宾德集团,成立于1960年,由Franz Binder在德国创立。起初,公司仅是一个机械加工车间,专注于加工车削件。然而,随着技术的不断积累和市场需求的增长,宾德开始专注于圆形连接器的生产。1967年,公司成功生产出第一只连接器,这标志着宾德正式进入连接器制造领域。此后,宾德不断投入研发,提升产品质量,逐渐在行业内崭露头角。
故事二:全球化布局
随着业务的不断扩展,宾德集团开始寻求全球化发展。1979年,宾德在瑞士成立了分公司Binder Electronic Components,标志着公司正式走向世界。此后,宾德在全球范围内迅速扩张,相继在美国、中国、法国、瑞典、英国、新加坡、荷兰和韩国等国家成立了子公司,并与全球45个经销商建立了合作关系。这一全球化布局不仅提升了宾德的品牌影响力,还为公司带来了更多的市场机会。
故事三:技术创新与产品多样化
宾德集团始终将技术创新视为企业发展的核心动力。公司不断投入研发资源,推出了一系列具有创新性的连接器产品。从微型连接器到电源连接器,再到医疗设备连接器和自动化技术连接器,宾德的产品线日益丰富,满足了不同行业的需求。特别是在工业自动化领域,宾德连接器以其高可靠性、高传输率和易于安装的特点,赢得了众多客户的青睐。
故事四:品质与认证
品质是宾德集团赖以生存和发展的基石。公司始终坚持高标准、严要求,确保每一件产品都符合国际质量标准。为此,宾德不仅通过了ISO 9001和ISO 14001等国际质量管理体系认证,还获得了UL、VDE和ESTI+等多项国际认证。这些认证不仅证明了宾德产品的卓越品质,也为客户提供了更多的信心和保障。
故事五:中国市场的发展
中国作为全球最大的电子市场之一,对宾德集团的发展具有重要意义。2001年,宾德在中国成立了全资子公司——南京宾德电气有限公司(宾德中国),负责中国地区的销售和客户服务。自成立以来,宾德中国凭借优质的产品和服务,迅速赢得了中国市场的认可。特别是在智能制造、自动化技术和医疗等领域,宾德连接器的应用越来越广泛,为中国电子行业的发展做出了积极贡献。
Fremont Micro Devices USA公司的发展故事
故事一:初创与成长
Fremont Micro Devices USA(简称FMD或弗里蒙特微)的故事始于对高性能模拟及数模混合信号集成电路设计的执着追求。公司于多年前在加利福尼亚成立,起初是一家小型但充满活力的初创企业,专注于非易失性存储芯片、MCU芯片和电源管理芯片的研发。凭借其创始团队在半导体行业的深厚背景和技术专长,FMD迅速在消费电子、便携设备和通讯/网络领域崭露头角。通过持续的技术创新和产品研发,FMD逐渐积累了市场声誉,吸引了多家国际知名风险投资公司的关注和支持,为公司的快速发展奠定了坚实的基础。
故事二:技术突破与市场拓展
在FMD的发展历程中,技术突破是推动其不断前进的重要动力。公司研发团队拥有国内外顶尖半导体企业的工作经验,他们致力于全定制和半定制的数模混合芯片设计,不断提升产品的性能和可靠性。通过不断的技术积累和创新,FMD在Memory、MCU和PMIC等领域取得了显著的技术突破,拥有了业界领先的技术基础和IP积累。这些技术成果不仅提升了公司的市场竞争力,也为其在消费类、智能硬件、IOT和工控安防等应用领域的市场拓展提供了有力支持。
故事三:全球化布局与供应链管理
随着业务的不断扩张,FMD开始布局全球化市场。公司在美国本土建立了完善的研发和生产体系,同时在中国深圳设立了总部,并在香港设立了办事处,以便更好地服务亚太地区的客户。此外,FMD还积极与全球知名的电子元器件分销商合作,建立了稳定的供应链体系。通过优化供应链管理,FMD确保了产品的质量和交付速度,进一步提升了客户满意度和市场竞争力。
故事四:应对行业挑战与危机
在电子行业的发展过程中,FMD也面临着诸多挑战和危机。例如,全球半导体市场的周期性波动、国际贸易环境的变化以及新冠疫情的爆发等都对公司的运营和发展产生了一定的影响。然而,FMD凭借其强大的技术实力和市场敏锐度,积极应对这些挑战和危机。公司通过加强研发创新、优化产品结构、拓展新兴市场等方式,保持了业绩的稳定增长,并在逆境中实现了新的发展。
故事五:上市规划与未来发展
近年来,FMD在资本市场也取得了重要进展。公司已完成与中信证券的上市辅导协议签署,并在深圳证监局备案,拟在A股市场挂牌上市。这一举措不仅将为FMD带来更多的资金支持和发展动力,也将进一步提升公司的品牌影响力和市场竞争力。展望未来,FMD将继续秉承高性能、高可靠性和低成本的理念,加大在研发创新和市场拓展方面的投入力度,为客户提供更加优质的产品和服务,推动公司向更高层次的发展迈进。
作为一家技术驱动的公司,Decawave始终将创新作为公司发展的核心动力。公司不断投入研发资源,推动UWB技术的升级和演进。通过不断的技术创新和产品升级,Decawave的UWB技术不断取得新的突破和进展,为电子行业的发展注入了新的活力。同时,公司也积极关注市场动态和客户需求的变化,不断调整和优化其产品和解决方案,以更好地满足客户的需求和期望。
CNC Tech公司深知,在竞争激烈的电子行业中,品质是赢得客户信任和市场口碑的关键。因此,公司始终坚持品质至上的原则,从原材料采购到生产制造的每一个环节都严格把控品质。CNC Tech还建立了完善的品质管理体系,通过严格的质量检测和持续的技术改进,确保每一台出厂的设备都能达到客户的期望和要求。正是凭借这种对品质的执着追求,CNC Tech赢得了广大客户的信赖和好评。
DAICO公司成立于XXXX年,最初是一家位于加利福尼亚的小型私营公司。在公司成立的初期,DAICO专注于研发和生产中频/射频和微波控制产品,以及放大器。这些产品主要用于国防电子和航空航天领域,为DAICO在电子行业中打下了坚实的基础。
B+B SmartWorx在成立初期便注重全球市场布局,特别是在美国和欧洲市场。通过多年的深耕细作,公司在这些地区建立了广泛的销售渠道和优秀的团队。其产品在美洲市场占据了58%的份额,欧洲市场占28%,其余地区占14%。这种全球布局不仅提升了公司的品牌知名度,也为其后续发展奠定了坚实的基础。
"经典的DSP的C程序和汇编程序库/常用例程"——学习资料!! http://sanhengxing.com/xzindex.asp 还有其他的关于等等单片机的资料,不知道有没有需要的,大家去看看吧! 关于 DSP DSP(digital singnal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件.其工作原理是接收模拟信号,转换为 ...… 查看全部问答∨ |
|
现在很多的引进设备或者引进图纸很多输入电源配备。三相电源输入配有黄/绿线接外裸金属柜体以及电机外壳,机柜内控制部分另有隔离的变压器或变换器,次级要求输出有一端接地,接地的双色线不是黄/绿线是其他的双色线。遇到如此配线方式我们该如何的 ...… 查看全部问答∨ |
|
大家好,我现在在学习使用msp430f2274单片机,想两个SPI口同时应用。 但是发现UCA0CLK和UCB0STE复用,UCA0STE和UCB0CLK也复用。 这样情况下不知道是否可以同时应用两个SPI口。 恳请请各位有经验的朋友帮分析一下!谢谢… 查看全部问答∨ |
|
基于zigbee物联网网关设计(毕设,要看些什么书啊,求救) 有A、B、C、D四个同学。 老师让B、C、D做基于zigbee的检测、传输。 让A做物联网网关系统的设计:接收zigbee数据(看单片机吗??) &nbs ...… 查看全部问答∨ |
以下是一个简答的3-8译码器的代码: module decoder_38(din,en,dout);input en; input[2:0] din;output[7:0] dout;reg[7:0] dout;always@(din or en)begin case(din) 3\'b0:dout=8\'b1111_1110; 3\'b1:dout=8\' ...… 查看全部问答∨ |