OpenEdv-开源电子网

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

用定时器的两个通道同时进行PWM波的采集,出现了问题,麻烦帮忙看一下。

[复制链接]

20

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2015-11-11
在线时间
22 小时
发表于 2015-11-21 16:01:51 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "stm32f10x.h" #include <usart.h> /************************************************ ALIENTEK 战舰STM32F103开发板实验0 工程模板 注意,这是手册中的新建工程章节使用的main文件 技术支持:www.openedv.com 淘宝店铺:http://eboard.taobao.com 关注微信公众平台微信号:"正点原子",免费获取STM32资料。 广州市星翼电子科技有限公司 作者:正点原子 @ALIENTEK ************************************************/ void Delay(u32 count) { u32 i=0; for(;i<count;i++); } u8 TIM5CH1_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH1_CAPTURE_VAL; //输入捕获值 u8 TIM5CH2_CAPTURE_STA=0; //输入捕获状态 u16 TIM5CH2_CAPTURE_VAL; //输入捕获值 u16 temp_CH1; u16 temp_CH2; TIM_ICInitTypeDef TIM5_ICInitStructure; void TIM5_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器3时钟*****(定时器3的时钟是挂靠在APB1总线时钟上面的)******* RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA外设***要用到GPIO口之前必须要使能GPIO的时钟*** //初始化GPIOA.0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); //初始化TIM5参数 TIM_TimeBaseStructure.TIM_Period=arr; TIM_TimeBaseStructure.TIM_Prescaler=psc; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure); //初始化TIM5 输入捕获通道1 TIM5_ICInitStructure.TIM_Channel=TIM_Channel_1|TIM_Channel_2;//选择输入端IC1映射到TI1. TIM5_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; TIM5_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; TIM5_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1; TIM5_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM5,&TIM5_ICInitStructure); //初始化化中断优先级 NVIC_InitStructure.NVIC_IRQChannel=TIM5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2,ENABLE); TIM_Cmd(TIM5,DISABLE); } void TIM5_IRQHandler(void) { if((TIM5CH1_CAPTURE_STA&0X80)==0) //没有捕获完成 { if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET) { if(TIM5CH1_CAPTURE_STA&0x40) //已经捕获到高电平 { if((TIM5CH1_CAPTURE_STA&0x3f)==0x3f) { TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH1_CAPTURE_VAL=0XFFFF; }else TIM5CH1_CAPTURE_STA++; } } if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件 { if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5); // TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 } else //还未开始,第一次捕获上升沿 { TIM5CH1_CAPTURE_STA=0; //清空 TIM5CH1_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } } if((TIM5CH2_CAPTURE_STA&0X80)==0) //没有捕获完成 { if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET) { if(TIM5CH2_CAPTURE_STA&0x40) //已经捕获到高电平 { if((TIM5CH2_CAPTURE_STA&0x3f)==0x3f) { TIM5CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次 TIM5CH2_CAPTURE_VAL=0XFFFF; }else TIM5CH2_CAPTURE_STA++; } } if (TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//捕获1发生捕获事件 { if(TIM5CH2_CAPTURE_STA&0X40) //捕获到一个下降沿 { TIM5CH2_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽 TIM5CH2_CAPTURE_VAL=TIM_GetCapture2(TIM5); // TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获 } else //还未开始,第一次捕获上升沿 { TIM5CH2_CAPTURE_STA=0; //清空 TIM5CH2_CAPTURE_VAL=0; TIM_SetCounter(TIM5,0); TIM5CH2_CAPTURE_STA|=0X40; //标记捕获到了上升沿 TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 } } } TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位 } void capture(u8 temp,u8 open) { if(open==ENABLE) { TIM_Cmd(TIM5,ENABLE); if(TIM5CH1_CAPTURE_STA&0X80)//成功捕获到了一个脉冲信号 { temp_CH1=TIM5CH1_CAPTURE_STA&0X3F; temp_CH1*=65536;//溢出时间总和 temp_CH1+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 printf("HIGH:%d us\r\n",temp_CH1);//打印总的高点平时间 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获 }; if(TIM5CH2_CAPTURE_STA&0X80)//成功捕获到了一个脉冲信号 { temp_CH2=TIM5CH1_CAPTURE_STA&0X3F; temp_CH2*=65536;//溢出时间总和 temp_CH2+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间 printf("HIGH:%d us\r\n",temp_CH1);//打印总的高点平时间 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获 }; } } int main(void) { while(1) { TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 capture(0,ENABLE); uart_init(115200); } } [/mw_shl_code]

寻找远方的自己,不断的学习。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-11-21 23:31:58 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 07:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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