【stm32】用TIM1产生6路ADC,用CCR4触发ADC1的注入通道采样
这几天一直在使用STM32来写sensorless BLDC的驱动框架,那么必须会用到TIM1的CCR1/CCR2/CCR3产生的六路互补PWM,以及用CCR4来产生一个中断,用来在PWM-ON的时候产生中断进行过零检测,以及相电流的检测等。
这几天一直在测试PWM,CCR4的中断,ADC1的采样触发+DMA等功能,现在也了解的差不多了,先记录下来,先看下我的一些设置,TIM1设置:
/* Time Base configuration ,init time1 freq*/
TIM_TimeBaseStructure.TIM_Period = Period;
TIM_TimeBaseStructure.TIM_Prescaler = ;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision = ;
TIM_TimeBaseStructure.TIM_RepetitionCounter = ;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); /* Automatic Output enable, Break, dead time and lock configuration*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = ;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); /*pwm driver set ,channel 1,2,3,4set pwm mode*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
//set OC1/OC1N
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//set oc2/oc2n
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
//set OC3/OC3N
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
//set adc sample time
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//CCR4这个输出使能后才能用来触发ADC1的注入通道采样
TIM_OCInitStructure.TIM_Pulse = ;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //enable interrupt
TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE); //CCR4的中断,这个通过设置CCR4的pulse来控制产生中断相当于PWM-ON的位置
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_COM,ENABLE); /* BLDC_TIMER_NUM counter enable */
TIM_Cmd(TIM1, ENABLE); /* Main Output Enable */
TIM_CtrlPWMOutputs(TIM1, ENABLE);
ADC1设置,这里采用规则通道+DMA+软件触发,注入通道+CCR4事件触发:
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 = ;
ADC_Init(ADC1, &ADC_InitStructure); ADC_TempSensorVrefintCmd(ENABLE);
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,,ADC_SampleTime_239Cycles5);//hand
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,,ADC_SampleTime_239Cycles5);//external temperature
ADC_RegularChannelConfig(ADC1,ADC_Channel_2,,ADC_SampleTime_239Cycles5);//vol
ADC_RegularChannelConfig(ADC1,ADC_Channel_10 ,,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,,ADC_SampleTime_239Cycles5);
//上面规则通道的设置,注意采样时间,我发现如果时间设置过的可能数据会互相干扰
//下面是注入通道,这里注入通道设置成TIM1的CCR4事件触发
ADC_InjectedSequencerLengthConfig(ADC1, );
ADC_InjectedChannelConfig(ADC1,ADC_Channel_TempSensor,,ADC_SampleTime_7Cycles5);//CURRENT
ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4);//这个可以使用time1的CCR4事件来触发采样
ADC_ExternalTrigInjectedConvCmd(ADC1,ENABLE); ADC_ITConfig(ADC1,ADC_IT_JEOC,ENABLE);//ENABLE INJECTED INTERRUPT
/* Enable automatic injected conversion start after regular one */
// ADC_AutoInjectedConvCmd(ADC1, ENABLE);//是否在规则通道结束之后自动开始注入通道采样 ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);
另外我还加了一个注入通道采样结束的中断,用来快速处理相电流的一些问题,比如限流、过流的处理。
测试从发现如果把CCR4的pulse设为0,那么就不会触发ADC1的注入采样,也就不会产生ADC的中断,只有pluse设置为一定的有效数值,那么adc注入通道的采样才会被触发。
【stm32】用TIM1产生6路ADC,用CCR4触发ADC1的注入通道采样的更多相关文章
- 【stm32】ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的:可能有时候会需要立刻采样,那样我们就需要利用到注入通道 ...
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ...
- stm32中adc的常规通道和注入通道的区别
STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换.STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换. 有2种划 ...
- stm32寄存器版学习笔记07 ADC
STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...
- STM32高级定时器TIM1产生两路互补的PWM波(带死区)
测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ...
- 【STM32】用DMA实现多路ADC通道数据采集
今天尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的 ...
- 【STM32系列汇总】小白博主的STM32实战快速进阶之路(持续更新)
我把之前在学习和工作中使用STM32进行嵌入式开发的经验和教程等相关整理到这里,方便查阅学习,如果能帮助到您,请帮忙点个赞: 本文的宗旨 STM32 只是一个硬件平台,同样地他可以换成MSP430,N ...
- STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。
实现这个功能,基本原理是利用STM32 的输出比较功能. 1.其它设置就是普通定时器的设置这里开启,四个输出比较中断,和一个更新中断, 更新中断这里不需要开也可以达到目的,我这里开启是做其它的用处的. ...
- STM32 TIM3 PWM输出 4路
一.设置TIM3的GPIO为推挽输出 void TIM3_IOConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClo ...
随机推荐
- 纯js实现积木(div)拖动效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- information_schema.events 学习
information_schema.events 表保存了整个mysql实例中的event 信息 1.常用列: 1.event_catalog :永远是def 2.event_schema :eve ...
- css清除浮动解决方案
清除浮动包括清除子元素的浮动和清除上级元素的浮动,其中清除上级元素的浮动,只需设置clear为both就可以了,而清除子元素的浮动则可以用空标签法.clearfix方法或overflow方法.因清除上 ...
- Linux下MySQL 5.6的修改字符集编码为UTF8(彻底解决中文乱码问题)
一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------- ...
- tomcat 项目部署问题
我本地Tomcat版本:Apache Tomcat/8.0.3.0 服务器端:Apache Tomcat/6.0.37 JVM都是:1.7.0_40-b43 之前项目运行正常,在我更新了一些模块后,重 ...
- Css 小技巧总结
相对偏移 指定left top等属性就能够够完美控制一个元素的位置 如: position:relative; left:2px; 今天遇到一个很好玩的问题,当两个并排浮动框,当一个框的长度太大时就会 ...
- iOS开发之property属性介绍
大家都知道@property和@synthesize可以自动生成某个类成员变量的存取方法,但可能对property中的一些属性不是很了解,网上的一些介绍有的不是很正确,感觉会误导新手,于是准备详细介绍 ...
- 用试探回溯法解决N皇后问题
学校数据结构的课程实验之一. 数据结构:(其实只用了一个二维数组) 算法:深度优先搜索,试探回溯 需求分析: 设计一个在控制台窗口运行的“n皇后问题”解决方案生成器,要求实现以下功能: 由n*n个方块 ...
- Kth Smallest Element in a BST 解答
Question Given a binary search tree, write a function kthSmallest to find the kth smallest element i ...
- Repeated DNA Sequences 解答
Question All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: ...