打印

STM32的基本TIM在进行PWM捕获时候不能两个通道同时用?

[复制链接]
5515|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
b57835o|  楼主 | 2012-3-3 20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的芯片是STM32F103ZET6 打算使用TIM4进行PWM信号的捕获,从手册得知是绑定Channel1和Channel2 Channel3和Channel4 CC1和CC3捕获高电平 CC2和CC4捕获低电平 但是在实际编码中,在线调试发现始终是CC1/2在工作,CC3/4处于冻结状态,这样就无法采集Channel2所输入的信号。尝试过修改TIM的捕获设置的每个选项,发现没有效果,不知道问题所在。我的代码如下:




#include "stm32f10x.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_tim.h"
TIM_OCInitTypeDef TIM_OCInitStructure;




void Rcc_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Config(void);
void TIM_Configuration(void);
void Delay(uint32_t nCounts);
int IC2Value = 0;
int main ()
{

Rcc_Configuration();

NVIC_Configuration();

GPIO_Config();

TIM_Configuration();



while(1)

{}
}


void Rcc_Configuration(void)
{

SystemInit();

//启动GPIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);

//启动AFIO

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//启动TIM4

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
}


void NVIC_Configuration()
{

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;                     //NVIC配置

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}


void Delay(uint32_t nCounts)
{

u32 uCounts = nCounts;

for(;nCounts > 0;nCounts--)

for(;uCounts > 0;uCounts--);
}


void GPIO_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;



//TIM4 PB7 CH2  PB9 CH4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_9;                               //GPIO配置
  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
GPIO_Init(GPIOB, &GPIO_InitStructure);





//LED

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
GPIO_Init(GPIOE, &GPIO_InitStructure);


}


void TIM_Configuration(void)
{

TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;

TIM_ICInitTypeDef TIM_ICInitStructure;





//TIM4设置  

//时基设置

TIM_BaseInitStructure.TIM_Prescaler = 36-1;

TIM_BaseInitStructure.TIM_ClockDivision = 0;

TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_BaseInitStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM4,&TIM_BaseInitStructure);



TIM_ICInitStructure.TIM_Channel = TIM_Channel_2|TIM_Channel_4;                   //通道选择
  
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       //上升沿触发

TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ;    //管脚与寄存器对应关系

TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;           //输入预分频。

TIM_ICInitStructure.TIM_ICFilter = 0x0;                            //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF

TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);                 //根据参数配置TIM外设信息


  
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1|TIM_TS_TI2FP2);                //选择IC1,2为触发源      这里不大懂触发源是怎么分配到捕获单元的



TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件



TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发

TIM_Cmd(TIM4, ENABLE);                                 //启动TIM4



TIM_ITConfig(TIM4, TIM_IT_CC2|TIM_IT_CC4, ENABLE);     //打开中断


}






中断处理函数:
void TIM4_IRQHandler(void)
{
  extern u16 IC2Value;
  if(TIM_GetITStatus(TIM4,TIM_IT_CC1) == SET)
  {
  
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);                //清楚TIM的中断待处理位
  
IC2Value = TIM_GetCapture1(TIM4);  
  }else if(TIM_GetITStatus(TIM4,TIM_IT_CC4) == SET)
  {
  
TIM_ClearITPendingBit(TIM4, TIM_IT_CC4);                //清楚TIM的中断待处理位
  
IC2Value = TIM_GetCapture4(TIM4);  
  }
}
沙发
b57835o|  楼主 | 2012-3-4 11:57 | 只看该作者
为什么只有人看没人回呢?难道是我的代码贴的太长了?

使用特权

评论回复
板凳
香水城| | 2012-3-4 11:59 | 只看该作者
STM32的基本TIM在进行PWM捕获时候不能两个通道同时用!

使用特权

评论回复
地板
arm菜鸟人| | 2012-3-4 12:33 | 只看该作者
怎么用TIM进行外部信号捕获呢?
比如一个方波信号每个周期中断一下。

使用特权

评论回复
5
b57835o|  楼主 | 2012-3-4 19:30 | 只看该作者
3# 香水城 感谢版主,追问一下,基本定时器不可以的话,高级定时器如TIM1 TIM8 是可以多路PWM捕获吗?可以几路?STM32F103ZET6

使用特权

评论回复
6
香水城| | 2012-3-5 14:05 | 只看该作者
3# 香水城 感谢版主,追问一下,基本定时器不可以的话,高级定时器如TIM1 TIM8 是可以多路PWM捕获吗?可以几路?STM32F103ZET6
b57835o 发表于 2012-3-4 19:30


高级定时器也只能进行一路PWM捕获。

使用特权

评论回复
7
heuyck| | 2012-3-15 12:13 | 只看该作者
使用PWM捕获貌似每路需要两个通道采样,一个通道采样上升沿,一个通道采样下降沿。
我是把每个通道都配置成上升下降沿触发,然后在中断里面读IO口状态。
比如有中断时读IO是高,就说明是低电平跳到高电平,是上升沿。
这样每路只需要一个通道来采样。

使用特权

评论回复
8
liugp25| | 2012-3-16 11:13 | 只看该作者
学习下

使用特权

评论回复
9
AProgrammer| | 2023-12-2 13:56 | 只看该作者
楼主问题解决了吗?我也遇到了一个类似的问题

使用特权

评论回复
10
probedog| | 2023-12-4 15:21 | 只看该作者
检查一下硬件配置

使用特权

评论回复
11
stormwind123| | 2023-12-4 15:22 | 只看该作者
检查你的代码中TIM的初始化函数和中断处理函数的配置是否正确。特别是要注意捕获模式的选择和中断优先级的设置。

使用特权

评论回复
12
童雨竹| | 2024-8-21 07:10 | 只看该作者

代码量小的时候用来做条件判断

使用特权

评论回复
13
Wordsworth| | 2024-8-21 08:13 | 只看该作者

在直流电流上叠加了一些小的交流电流分量

使用特权

评论回复
14
Clyde011| | 2024-8-21 09:16 | 只看该作者

连接点是产生控制IC所要检测的小电压的所有器件的公共连接点

使用特权

评论回复
15
公羊子丹| | 2024-8-21 10:09 | 只看该作者

这是个再正常不过的coding习惯

使用特权

评论回复
16
万图| | 2024-8-21 11:12 | 只看该作者

宽度则与电感量和电阻量成反比

使用特权

评论回复
17
Uriah| | 2024-8-21 12:15 | 只看该作者

电流要增大

使用特权

评论回复
18
帛灿灿| | 2024-8-21 14:11 | 只看该作者

有些信号包含丰富的高频分量

使用特权

评论回复
19
Bblythe| | 2024-8-21 15:14 | 只看该作者

交流电流环路的布线要在其他引线之前布好

使用特权

评论回复
20
周半梅| | 2024-8-21 17:10 | 只看该作者

对于优秀程序员来说,这不是好代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

14

帖子

1

粉丝