stm32 ADC的规则通道和注入通道混合使用 双adc dma tim触发 pwm 电机
来源:互联网 发布:网络写手怎么赚钱 编辑:程序博客网 时间:2024/05/22 20:43
原文地址,后面有添加:
http://www.cnblogs.com/nixianmin/p/3192634.html
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释:
1 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 2 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 3 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。
1 ADC_InjectedSequencerLengthConfig(ADC1, 1);\\设置注入通道长度2 ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\\配置注入通道3 ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\\开始注入通道数据采样和转换
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
如果设置了 JAUTO 位,在规则组通道之后,注入组通道被自动转换。这可以用来转换在 ADC_SQRx 和 ADC_JSQR 寄存器中设置的多至 20 个转换序列。
查了下文档,只有在规则通道的转换结束时才产生 DMA 请求,并将转换的数据从 ADC_DR 寄存器传输到用户指定的目的地址,还有注入方式转换后数据存储到 ADC_DRJx寄存器和规则方式转换后数据存储在ADC_DR寄存器中。
static void Protect_AdcInit(void){ ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 2;//规则通道的数量 ADC_Init(ADC1, &ADC_InitStructure);//这个大部分是初始化规则通道的 ADC_TempSensorVrefintCmd(ENABLE); ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5); ADC_InjectedSequencerLengthConfig(ADC1, 1); ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5); ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);//设置规则通道软件触发 /* Enable automatic injected conversion start after regular one */ // ADC_AutoInjectedConvCmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 external trigger */ ADC_ExternalTrigConvCmd(ADC1, DISABLE); ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1));}
======================没完,继续=================
读取数据在这里:
/* 注入转换中断 */
void ADC1_2_IRQHandler(void)
{
s32 inj_v1,inj_v2,inj_v3,inj_v4;
if(ADC_GetITStatus(ADC1,ADC_IT_JEOC) == SET){
ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);
inj_v1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
inj_v1 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_4);
inj_v1 >>= 1;
inj_v2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
inj_v2 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_3);
inj_v2 >>= 1;
inj_v3 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3);
inj_v3 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_2);
inj_v3 >>= 1;
inj_v4 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_4);
inj_v4 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_1);
inj_v4 >>= 1;
}
}
/* 规则转换中断 */
void DMA1_Channel1_IRQHandler(void)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET){
DMA_ClearFlag(DMA1_FLAG_TC1);
DMA_ClearITPendingBit(DMA1_IT_GL1);
ADC_SoftwareStartConvCmd(ADC1,DISABLE);
DMA_Cmd(DMA1_Channel1,DISABLE);
/* ¼ÆËãת»»Öµ */
regular_convert_calc();
/* Æô¶¯ÏÂÒ»´Î´«Êä */
DMA1_Channel1->CNDTR = NUM_OF_REG_CHANNEL;
DMA_Cmd(DMA1_Channel1,ENABLE);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}
}
还有这篇说的也不错: 用TIM1产生6路ADC,用CCR4触发ADC1的注入通道采样
http://www.csdn123.com/html/itweb/20130801/33722_33714_33696.htm
- stm32 ADC的规则通道和注入通道混合使用 双adc dma tim触发 pwm 电机
- STM32 ADC的规则通道和注入通道的区别
- STM32 ADC的规则通道和注入通道的区别
- STM32 ADC注入通道的使用
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别(转)
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别
- STM32 ADC的规则通道和注入通道有什么区别
- stm32的多通道ADC和DMA的设置问题
- stm32 多通道ADC+DMA采集
- STM32 DMA 多通道 ADC 采集
- stm32 adc dma多通道采样 数据错位 的解决方法
- STM32 ADC 规则多通道转换
- STM32 ADC 规则多通道转换
- hdu1071 2010.3.5
- hdu1045 2010.3.5
- Android- 友盟社会化分享【5.0版本集成文档】
- hdu1035 2010.3.5
- cron任务执行oracle冷备提示:Invalid format of Export utility name
- stm32 ADC的规则通道和注入通道混合使用 双adc dma tim触发 pwm 电机
- 买了移动硬盘,你知道怎么鉴别真伪,保养,分区吗???
- [Leetcode]166. Fraction to Recurring Decimal @python
- gradle编译时遇到的问题
- Arrays类
- 分布式日志分析系统构建实战(三)——Kafka
- apache commons io 资源管理
- Meteor
- 在HTML中给PPAPI插件配置参数