stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

编程入门 行业动态 更新时间:2024-10-08 22:48:08

stm32F4 <a href=https://www.elefans.com/category/jswz/34/1768459.html style=多路ADC 之七路ADC(双重ADC 多通道)(DMA)"/>

stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

上来就说要点
一般设置都没什么问题
就是这个7,
要是6或8(偶数)多好
因为双重ADC,不是把数据都放到ADC1->DR 和ADC2->DR 里,而是放在ADC->CDR里,那两个都是16位滴,这个是32位滴。低16位ADC1,高16位ADC2。

这也不算啥,如果是6或8(偶数),一般人看到这应该就能解决大多数问题了。然而这是个7(我用的ADC1的三个和ADC2的四个),然后DMA循环模式传输,最开始自己定义了一个ADC_VAL[7]数组存放数据。
看到这,如果你没疑惑,恭喜你,你可能就卡在这卡死几天(比如我,7个通道不就应该数组长度7吗?)。
那应该有什么疑惑呢,ADC->CDR是32位滴,你的数组应该是偶数才行,要不然数据就会错位,拿一个数据举例,就是它会像爬楼梯一样,向上走,走完,再爬一边楼梯。
所以应该定义ADC_VAL[8],看着这,剩下的问题一般人都能自己解决了。
转载请注明出处,尊敬一下我滴头发

多写点吧

DMA

	DMA_InitStructure.DMA_PeripheralBaseAddr = RHEOSTAT_ADC_CDR_ADDR;	//#define RHEOSTAT_ADC_CDR_ADDR    ((uint32_t)0x40012308)//手册里有,不明白的可以自己算DMA_InitStructure.DMA_BufferSize = 8;	//7路记得写8// // 外设数据大小为半字,即两个字节 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //	存储器数据大小也为半字,跟外设数据大小相同DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;	// 循环传输模式 DMA_Mode_Normal DMA_Mode_CircularDMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

ADC

	// 双重ADC模式ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;// 时钟为fpclk x分频	ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
//这里提一下原子说不能超过36m,但是官方例子写的是
//  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
//不知道是原子错了,还是官方例子没注意// 禁止DMA直接访问模式	ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;// 扫描模式,多通道采集ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 连续转换	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_NbrOfConversion = 4;ADC_Init(RHEOSTAT_ADC1, &ADC_InitStructure);	ADC_RegularChannelConfig(RHEOSTAT_ADC1, RHEOSTAT_ADC_CHANNEL1, 1, ADC_SampleTime_3Cycles);   ADC_RegularChannelConfig(RHEOSTAT_ADC1, ADC_Channel_5, 2, ADC_SampleTime_3Cycles);   ADC_RegularChannelConfig(RHEOSTAT_ADC1, ADC_Channel_7, 3, ADC_SampleTime_3Cycles); ADC_InitStructure.ADC_NbrOfConversion = 4;ADC_Init(RHEOSTAT_ADC2, &ADC_InitStructure);ADC_RegularChannelConfig(RHEOSTAT_ADC2, RHEOSTAT_ADC_CHANNEL2, 1, ADC_SampleTime_3Cycles);   ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_11, 2, ADC_SampleTime_3Cycles);   ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_12, 3, ADC_SampleTime_3Cycles);   ADC_RegularChannelConfig(RHEOSTAT_ADC2,  ADC_Channel_14, 4, ADC_SampleTime_3Cycles);   // 使能DMA请求 after last transfer (multi-ADC mode)ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE);
// 使能ADC DMAADC_DMACmd(RHEOSTAT_ADC1, ENABLE);ADC_DMACmd(RHEOSTAT_ADC2, ENABLE);// 使能ADCADC_Cmd(RHEOSTAT_ADC1, ENABLE);  ADC_Cmd(RHEOSTAT_ADC2, ENABLE);   //开始adc转换,软件触发ADC_SoftwareStartConv(RHEOSTAT_ADC1);//ADC_SoftwareStartConv(RHEOSTAT_ADC2);LCD_ShowxNum(150,Y1,adcx[0]-7000,8,16,0);
//这个东西不能显示小数,负数

更多推荐

stm32F4 多路ADC 之七路ADC(双重ADC 多通道)(DMA)

本文发布于:2024-02-06 12:21:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748986.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多路   通道   DMA   ADC

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!