OpenEdv-开源电子网

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

分享stm32mini板子PWM输入模式测试周期和占空比的程序

[复制链接]

10

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2013-8-18
在线时间
5 小时
发表于 2013-9-17 11:11:58 | 显示全部楼层 |阅读模式

一直以来在论坛只问没有分享过,感谢原子的耐心解答,今天我就将我写的PWM输入库函数版本程序分享一下,已经在开发板通过了!我没有处理溢出问题,如果你的周期足够大,那么你自己加上这个机制。

------------------------------------------------------------------------------------------main.c------------------------------------------------------------------------

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
//ALIENTEK????STM32??·?°????é9
//PWM???????é 
//?????§????www.openedv.com
//?????????í??×?????????????

extern u16 DutyCycle,Frequency,IC2Value;
 int main(void)
 {  
  
 SystemInit();
 delay_init(72);       //???±??????????  
 NVIC_Configuration();   //?è??NVIC????·?×é2:2??????????????2???ì????????
 uart_init(9600);  //????????????9600
  TIM3_PWMINPUT_INIT(0xFFFF,72-1);
 
while(1){
  delay_ms(20);
  printf("DutyCycle = %d\r\n",DutyCycle);
  printf("Frequency = %d\r\n",Frequency);
 // printf("IC2Value = %d\r\n",IC2Value);
}

 }
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


----------------------------------------------------------------------------------------time.c-------------------------------------------------------------------------------------------------------------
#include "timer.h"
#include "led.h"
#include "usart.h"
////////////////////////////////////////////////////////////////////////////////// 
//±????ò?????§?°?????????­×÷???í???????????????ü????????
//ALIENTEK Mini STM32??·?°?
//PWM  ?????ú??     
//?????­×?@ALIENTEK
//????????:www.openedv.com
//????????:2010/12/03
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ?????­×? 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////   

//?¨???¨?±?÷??????????
//?????±????????APB1??2±?????APB1??36M
//arr??×?????×°????
//psc???±???¤·?????
//?????????????¨?±?÷3!
void TIM3_PWMINPUT_INIT(u16 arr,u16 psc)
{
  
 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 TIM_ICInitTypeDef  TIM3_ICInitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);     //open TIM3 clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //open gpioA clock
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                               //GPIO??
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
 TIM_TimeBaseStructure.TIM_Period = arr; //?è???????????ü??????×°????????×?????×°???????÷????????  ??????5000??500ms
 TIM_TimeBaseStructure.TIM_Prescaler =psc; //?è??????×÷??TIMx?±?????????????¤·?????  10Khz?????????? 
 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //?è???±??·???:TDTS = Tck_tim
 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?ò??????????
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //?ù??TIM_TimeBaseInitStruct?????¨????????????TIMx???±???ù??????
 
 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                    
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2;                  
  TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;      
  TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  
  TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
 TIM3_ICInitStructure.TIM_ICFilter = 0x0;
 
 TIM_PWMIConfig(TIM3, &TIM3_ICInitStructure);               
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);              
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
  TIM_Cmd(TIM3, ENABLE);                                       
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);  
}


u16 IC2Value = 0,DutyCycle = 0,Frequency = 0;

void TIM3_IRQHandler(void)
{
 
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);                //??TIM???????
 
  IC2Value = TIM_GetCapture2(TIM3);                         //??IC2???????,??PWM??????
  if (IC2Value != 0)
  {
  
    DutyCycle = TIM_GetCapture1(TIM3);
    Frequency = IC2Value;                                          //??PWM???
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-9-17 14:18:32 | 显示全部楼层
谢谢分享,方便上传工程么?
这样方便大家测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-10-17 09:33:27 | 显示全部楼层
回复【楼主位】lifan_cn:
---------------------------------
LZ和原子哥好啊:
     我用你的这个程序怎么不行啊,为什么DutyCycle始终是0 啊
回复 支持 反对

使用道具 举报

10

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-10-22 14:00:59 | 显示全部楼层
回复【3楼】summerxiehao:
---------------------------------
首先几个注意点1.必须得有PWM波形2.输入信号接到PA7引脚。你调试一下吧!本来是想传源码的!可是太大!网速慢就贴了个程序!你在试试
回复 支持 反对

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-10-24 09:00:30 | 显示全部楼层
回复【4楼】lifan_cn:
---------------------------------
谢谢楼主的回复,我做的是用一个按键接到PA7的,然后用PWM测按键按下的时间,这样应该也可以吧。。。但是,我的DutyCycle始终是0,不知道为什么啊。。。我就是用的你的程序差不多的。。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-10-24 09:04:12 | 显示全部楼层
谢谢分享,上传工程好一些。已经看到乱码了。
一直努力就很好。
回复 支持 反对

使用道具 举报

10

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-10-24 12:59:57 | 显示全部楼层
回复【5楼】summerxiehao:
---------------------------------
直接将你的PWM波形接到PA7上就行了。我给你们整理一下吧!等周六日,我将东西整理一下,然后将源码和原理给你们传上去。供你们验证,和学习
回复 支持 反对

使用道具 举报

10

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-10-24 13:01:13 | 显示全部楼层
回复【6楼】qq942266575:
---------------------------------
看到既然有人关注,那么我就将源码整理一下,在把原理写写,供大家学习和验证吧!
回复 支持 反对

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-10-25 17:31:38 | 显示全部楼层
回复【8楼】lifan_cn:
---------------------------------
谢谢lZ分享。。。。
回复 支持 反对

使用道具 举报

10

主题

41

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
256
金钱
256
注册时间
2013-8-18
在线时间
5 小时
 楼主| 发表于 2013-10-27 07:57:33 | 显示全部楼层
我已经将我的源码和程序的讲解分享了,不过有开了一个帖子,你直接搜索PWM输入捕捉四路PWM波形的周期和占空比就行!
回复 支持 反对

使用道具 举报

18

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
175
金钱
175
注册时间
2013-10-17
在线时间
0 小时
发表于 2013-10-27 23:31:04 | 显示全部楼层
回复【10楼】lifan_cn:
---------------------------------
谢谢LZ,顶!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-7-30
在线时间
0 小时
发表于 2016-7-30 00:27:11 | 显示全部楼层
谢谢,同样是测量低频的时候弄不好
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-2-2
在线时间
4 小时
发表于 2020-2-25 23:07:28 | 显示全部楼层
谢谢楼主,先收藏
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-21 01:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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