OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2718|回复: 2

单脉冲模式激励的来源问题

[复制链接]

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
发表于 2016-3-27 23:14:07 | 显示全部楼层 |阅读模式
5金钱
按照手册,单脉冲模式的激励来自外部高电平或者上升沿。那可不可以来自其他定时器输出的脉冲上升沿?就是假设我使用定时器4输出单脉冲,定时器4设置为从模式,触发模式。同时定时器3设置为主模式,定时器3的通道1输出PWM波,作为触发源。这样可不可以呢?有没有大神做过这类测试

最佳答案

查看完整内容[请看2#楼]

可以的, 我在步进电机驱动闭环处理时,有一个电流采样时间的问题就是这样处理的, 我的 PWM是用定时器1产生的, 不过你用哪个产生都一样 /******************************************************************************************** 函数名: 设置TIM4初始化函数 调 用: TIM4_int(); 参 数: 无 说 明: 将定时器设置为单脉冲从模式,由定时器1每次更新起动,中断中完成触发ADC1的任务 ****************************** ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2016-3-27 23:14:08 | 显示全部楼层
本帖最后由 likunxue 于 2016-3-28 02:23 编辑

可以的, 我在步进电机驱动闭环处理时,有一个电流采样时间的问题就是这样处理的,
我的 PWM是用定时器1产生的, 不过你用哪个产生都一样

/********************************************************************************************
函数名: 设置TIM4初始化函数
调  用: TIM4_int();
参  数: 无
说  明: 将定时器设置为单脉冲从模式,由定时器1每次更新起动,中断中完成触发ADC1的任务  
********************************************************************************************/
void TIM4_Init(void)
     {   
     RCC->APB1ENR |= 1<<2;               //TIM4时钟使能   
     TIM4->ARR = 65535;                  //设定计数器自动重装值            
     TIM4->PSC = 0;                      //预分频器0,计数时钟36MHZ
     BIT_ADM(TIM4->CR1,4) = 0;           //向上计数模式      
     BIT_ADM(TIM4->EGR,0) = 1;           //产生更新事件更新定时器2         
     BIT_ADM(TIM4->CR1,7)  = 0;          //禁止ARR预装载缓冲器
     BIT_ADM(TIM4->SR, 0)  = 0;          //清除中断标志
     //外部触发选择 TS = 0; 选择定时器1更新中断触发起动定时器4      
     BIT_ADM(TIM4->SMCR,4) = 0;     
     BIT_ADM(TIM4->SMCR,5) = 0;     
     BIT_ADM(TIM4->SMCR,5) = 0;   
     //SMS 从模式设置, 触发方式,计数器在TRGI的上升沿启动,但不复位
     //只有计数器的起动中控制的              
     BIT_ADM(TIM4->SMCR,0) = 0;     
     BIT_ADM(TIM4->SMCR,1) = 1;   
     BIT_ADM(TIM4->SMCR,2) = 1;
     //MMS[1:0]主模式选择,
     BIT_ADM(TIM4->CR2,4) = 0;           //010 选择定时器更新事件触发输出 TRGO信号   
     BIT_ADM(TIM4->CR2,5) = 1;     
     BIT_ADM(TIM4->CR2,6) = 0;   
            
     BIT_ADM(TIM4->CR1,3)  = 1;          //OPM 置定时器为单脉冲模式      
     BIT_ADM(TIM4->DIER,0) = 1;          //开定时器4中断  
     SVP.ADC1_CNT = 65536-SVP.PWMPRD/2;  //ADC1下次采样时刻(初始化设置为PWM波的中点
     TIM4->CNT = SVP.ADC1_CNT;        
     MY_NVIC_Init(0,0,TIM4_IRQn,4);      //抢占0,子优先级0,组4        
     }

/********************************************************************************************
函数名: 空间失量调制SVPWM定时器1初始化函数
调  用: SVPWM_TIM1_int(void)
参  数: 无                       
********************************************************************************************/
void SVPWM_TIM1_int(void)
     {         
     RCC->APB2ENR |= 1<<11;            //TIM1时钟使能  
     RCC->APB2ENR |= 1<<2;             //使能PORTA时钟         
     GPIOA->CRH &= 0xFFFF0000;   
     GPIOA->CRH |= 0x0000BBBB;         //PA8,PA9,PA10,PA11 复用功能   
     BIT_ADM(GPIOA->ODR, 8) = 1;        
     BIT_ADM(GPIOA->ODR, 9) = 1;      
     BIT_ADM(GPIOA->ODR,10) = 1;
     BIT_ADM(GPIOA->ODR,11) = 1;
        
     //通道1的输出配置         
     BIT_ADM(TIM1->CCMR1,3)  = 1;      //CH1预装载使能      
     BIT_ADM(TIM1->CCMR1,4)  = 0;      //CH1_PWM1模式
     BIT_ADM(TIM1->CCMR1,5)  = 1;   
     BIT_ADM(TIM1->CCMR1,6)  = 1;        
     BIT_ADM(TIM1->CCER,0)   = 1;      //CH1输出使能(PA8)  
     BIT_ADM(TIM1->CCER,1)   = 0;      //主输出极性CC1P (0高电平有效,1低电平有效)
     //通道2的输出配置
     BIT_ADM(TIM1->CCMR1,11) = 1;      //CH2预装载使能
     BIT_ADM(TIM1->CCMR1,12) = 0;      //CH2_PWM1模式
     BIT_ADM(TIM1->CCMR1,13) = 1;
     BIT_ADM(TIM1->CCMR1,14) = 1;
     BIT_ADM(TIM1->CCER,4)   = 1;      //CH2输出使能(PA9)     
     BIT_ADM(TIM1->CCER,5)   = 0;      //主输出极性CC2P (0高电平有效,1低电平有效)
     //通道3的输出配置  

     BIT_ADM(TIM1->CCMR2,3)  = 1;      //CH3预装载使能      
     BIT_ADM(TIM1->CCMR2,4)  = 0;      //CH3_PWM1模式
     BIT_ADM(TIM1->CCMR2,5)  = 1;   
     BIT_ADM(TIM1->CCMR2,6)  = 1;        
     BIT_ADM(TIM1->CCER,8)   = 1;      //CH3输出使能(PA10)  
     BIT_ADM(TIM1->CCER,9)   = 0;      //主输出极性CC3P (0高电平有效,1低电平有效)
     //通道4的输出配置  
     BIT_ADM(TIM1->CCMR2,11) = 1;      //CH4预装载使能
     BIT_ADM(TIM1->CCMR2,12) = 0;      //CH4_PWM1模式
     BIT_ADM(TIM1->CCMR2,13) = 1;
     BIT_ADM(TIM1->CCMR2,14) = 1;
     BIT_ADM(TIM1->CCER,12)  = 1;      //CH4输出使能(PA11)     
     BIT_ADM(TIM1->CCER,13)  = 0;      //主输出极性CC4P (0高电平有效,1低电平有效)
     //比较寄存器初始化
     TIM1->CCR1 = 0;                   //初始化比较寄存器全部为0初始输出低电平                  
     TIM1->CCR2 = 0;                  
     TIM1->CCR3 = 0;                  
     TIM1->CCR4 = 0;                  
     //定时器1初始化其它功能设置
     TIM1->ARR = SVP.PWMPRD;           //设定计数器自动重装值PWM的周期   
     TIM1->PSC = 0 ;                   //预分频器0
     BIT_ADM(TIM1->CR1,7) = 1;         //定时器ARPE充许
     BIT_ADM(TIM1->CR1,5) = 0;         ///边沿对齐模式
     BIT_ADM(TIM1->CR1,6) = 0;         
     //BIT_ADM(TIM1->CR1,4) = 1;       //向下计数
     //设置MMS[2:0] 主模式选择,定时器的更新中断起动从定时器
     BIT_ADM(TIM1->CR2,4) = 0;
     BIT_ADM(TIM1->CR2,5) = 1;
     BIT_ADM(TIM1->CR2,6) = 0;
     BIT_ADM(TIM1->DIER,0) = 1;         //开定时器1中断
     BIT_ADM(TIM1->BDTR,15)= 1;         //MOE位,主输出使能,只有该位是1全部 PWM才用有输出  
     BIT_ADM(TIM1->SR,0)   = 0;         //清除中断标志
     MY_NVIC_Init(0,0,TIM1_UP_IRQn,4);  //抢占1,子优先级0,组4
     BIT_ADM(TIM1->EGR,0) = 1;          //UG位,产生更新事件,软件置1,硬件自动清零  
     TIM4_Init();                                 //初始化定时器4
     BIT_ADM(TIM1->CR1,0) = 0;          //初始化关闭定时器没有PWM输出
     }               


这样,定时器1每次中断都会触发定时器4 一次, 由定时器4的中断更新触发 ADC自动完成转换! 这种方法,是可行的 只需要在定时器1的中断函数里更新 定时器4的计数器的值,就可以自由更改ADC的采样时间, 不用这种方法, 基本无法实现在PWM波的任意时刻采样电流值
/*******************************************************************************************
函 数 名: 定时器4中断函数
调    用: 无
参    数: 无
反 回 值: 无 (更新ADC2的注入组采样时间)
********************************************************************************************/  
void TIM4_IRQHandler(void)
     {
     if(BIT_ADM(TIM4->SR,0) ==1)
       {                 
       BIT_ADM(TIM4->SR,0)= 0;     //清除中断标志
       TIM4->CNT = SVP.ADC2_CNT;   //重装下次采样时时              
       }
     }  










回复

使用道具 举报

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-11-26
在线时间
10 小时
 楼主| 发表于 2016-3-28 20:47:06 | 显示全部楼层
likunxue 发表于 2016-3-28 02:06
可以的, 我在步进电机驱动闭环处理时,有一个电流采样时间的问题就是这样处理的,
我的 PWM是用定时器1产生 ...

直接采纳哥哥你的了。顺便再请教一下,1、我使用外设复位寄存器复位定时器1,是不是就是把定时器1的所有寄存器全部恢复默认值?2、我自己做的一个F405板子,拷贝了原子哥的系统时钟设置,可是输出信号总和自己想的不一样啊,查了手册,最高频率都是168M啊,晶振也是8兆的。我也不是要哥哥你直接给答案,就随便说说可能性,我再自己去查找哪里设置错了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 12:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表