STM32_PWM
所属分类:单片机开发
开发工具:C/C++
文件大小:24KB
下载次数:13
上传日期:2013-01-14 15:47:39
上 传 者:
JJOrange
说明: stm32的pwm输入功能的实现,程序已通过调试
(STM32 PWM input functions of program through the debugging)
文件列表:
STM32_PWM\cortexm3_macro.s (10439, 2008-10-09)
STM32_PWM\Functions\SetClock.c (2382, 2008-10-09)
STM32_PWM\Functions\SetGPIO.c (1954, 2008-10-09)
STM32_PWM\Functions\SetNVIC.c (1159, 2008-10-09)
STM32_PWM\Functions\SetPWMI.c (1735, 2008-10-09)
STM32_PWM\Functions\SetUsart.c (4703, 2008-10-09)
STM32_PWM\Functions\UET_GPIO.h (22987, 2008-10-09)
STM32_PWM\main.c (3600, 2008-10-09)
STM32_PWM\stm32f10x_conf.h (6439, 2008-10-09)
STM32_PWM\stm32f10x_it.c (31464, 2008-10-09)
STM32_PWM\stm32f10x_it.h (3973, 2008-10-09)
STM32_PWM\stm32f10x_vector.s (13002, 2008-10-09)
STM32_PWM\STM32_PWM_Input.Opt (3694, 2009-03-17)
STM32_PWM\STM32_PWM_Input.plg (191, 2008-10-09)
STM32_PWM\STM32_PWM_Input.Uv2 (3520, 2008-10-09)
STM32_PWM\STM32_PWM_Input_Opt.Bak (3684, 2009-03-17)
STM32_PWM\STM32_PWM_Input_STM32_PWM_Input.dep (15447, 2009-06-07)
STM32_PWM\STM32_PWM_Input_Target 1.dep (82, 2008-10-09)
STM32_PWM\Functions (0, 2013-01-14)
STM32_PWM (0, 2013-01-14)
参考手册资料说明,与本程序可能不完全一样,仅供学习参参考使用:
PWM输入模式
该模式是输入捕获模式的一个特例,除下列区别外,工作过程与输入捕获模式相
同:
● 两个ICx 信号被映射同一个TIx 输入。
● 这2 个ICx 信号为边沿有效,但是极性相反。
● 其中一个TIxFP 信号被作为触发输入信号,并且从模式控制器被配置成复
位模式。
例如,你能够测量输入到TI1 上的PWM 信号的长度(TIMx_CCR1 寄存器)和占空
比(TIMx_CCR2 寄存器),具体步骤如下(取决于CK_INT 的频率和预分频器的值)
● 选择TIMx_CCR1 的有效输入端:置TIMx_CCMR1 寄存器的CC1S=01(选
择TI1);
● 选择TI1FP1 的有效极性(用来捕获数据到TIMx_CCR1 中和清除计数器):
置CC1P=0;
● 选择TIMx_CCR2 的有效输入端:置TIMx_CCMR1 寄存器的CC2S=10(选
择TI1);
● 选择TI1FP2 的有效极性(用来捕获数据到TIMx_CCR2):置CC2P=1(下降
沿有效);
● 选择有效的触发输入信号:置TIMx_SMCR 寄存器中的TS=101(选择
TI1FP1);
● 配置从模式控制器为复位模式:置TIMx_SMCR 中的SMS=100;
● 使能捕获:置TIMx_CCER 寄存器中CC1E=1 且CC2E=1。
从模式:复位模式
在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,
如果TIMx_CR1 寄存器的URS 位为低,还产生一个更新事件UEV;然后所有的
预装载寄存器(TIMx_ARR, TIMx_CCRx)都被更新了。
在以下的例子中,TI1 输入端的上升沿导致向上计数器被清零:
● 配置通道1 以检测TI1 的上升沿。配置输入滤波器的带宽(在本例中,不需
要任何滤波器,因此保持IC1F=0000)。触发操作中不使用捕获预分频器,
所以不需要配置。CC1S 位只选择输入捕获源,即TIMx_CCMR1 寄存器中
CC1S=01。置TIMx_CCER 寄存器中CC1P=0 以确定极性(只检测上升
沿)。
● 置TIMx_SMCR 寄存器中SMS=100 , 配置定时器为复位模式; 置
TIMx_SMCR 寄存器中TS=101,选择TI1 作为输入源。
● 置TIMx_CR1 寄存器中CEN=1,启动计数器。
计数器开始依据内部时钟计数,然后正常运转直到TI1 出现一个上升沿;此时,
计数器被清零然后从0 重新开始计数。同时,触发标志(TIMx_SR 寄存器中的TIF
位)被设置,根据TIMx_DIER 寄存器中TIE(中断使能)位和TDE(DMA 使能)位的
设置,产生一个中断请求或一个DMA 请求。
下图显示当自动重装载寄存器TIMx_ARR=0x36 时的动作。在TI1 上升沿和计数
器的实际复位之间的延时取决于TI1 输入端的重同步电路。
有用函/*******************************************************************************
* Function Name : TIM_SelectInputTrigger
* Description : Selects the Input Trigger source
* Input : - TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM
* peripheral.
* - TIM_InputTriggerSource: The Input Trigger source.
* This parameter can be one of the following values:
* - TIM_TS_ITR0: Internal Trigger 0
* - TIM_TS_ITR1: Internal Trigger 1
* - TIM_TS_ITR2: Internal Trigger 2
* - TIM_TS_ITR3: Internal Trigger 3
* - TIM_TS_TI1F_ED: TI1 Edge Detector
* - TIM_TS_TI1FP1: Filtered Timer Input 1
* - TIM_TS_TI2FP2: Filtered Timer Input 2
* - TIM_TS_ETRF: External Trigger input
* Output : None
* Return : None
*******************************************************************************/
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, u16 TIM_InputTriggerSource)
{
u16 tmpsmcr = 0;
/* Check the parameters */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_TRIGGER_SELECTION(TIM_InputTriggerSource));
/* Get the TIMx SMCR register value */
tmpsmcr = TIMx->SMCR;
/* Reset the TS Bits */
tmpsmcr &= SMCR_TS_Mask;
/* Set the Input Trigger source */
tmpsmcr |= TIM_InputTriggerSource;
/* Write to TIMx SMCR */
TIMx->SMCR = tmpsmcr;
}
/*******************************************************************************
* Function Name : TIM_SelectSlaveMode
* Description : Selects the TIMx Slave Mode.
* Input : - TIMx: where x can be 1, 2, 3, 4, 5 or 8 to select the TIM
* peripheral.
* - TIM_SlaveMode: specifies the Timer Slave Mode.
* This paramter can be one of the following values:
* - TIM_SlaveMode_Reset
* - TIM_SlaveMode_Gated
* - TIM_SlaveMode_Trigger
* - TIM_SlaveMode_External1
* Output : None
* Return : None
*******************************************************************************/
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, u16 TIM_SlaveMode)
{
/* Check the parameters */
assert_param(IS_TIM_123458_PERIPH(TIMx));
assert_param(IS_TIM_SLAVE_MODE(TIM_SlaveMode));
/* Reset the SMS Bits */
TIMx->SMCR &= SMCR_SMS_Mask;
/* Select the Slave Mode */
TIMx->SMCR |= TIM_SlaveMode;
}
捕获/比较寄存器1(TIMx_CCR1)
CCR1[15:0]: 捕获/比较1的值
若CC1通道配置为输出:
CCR1是装入当前捕获/比较1寄存器的值(预装载值)。
如果在TIMx_CCMR1寄存器(OC1PE位)中未选择预装载特性,其始终装入当前寄存器中。
否则,只有当更新事件发生时,此预装载值才装入当前捕获/比较1寄存器中。
当前捕获/比较寄存器包含了与计数器TIMx_CNT比较的值,并且在OC1端口上输出信号。
若CC1通道配置为输入:
CCR1包含了由上一次输入捕获1事件(IC1)传输的计数器值。
捕获/比较寄存器2(TIMx_CCR2)
CCR2[15:0]: 捕获/比较2的值
若CC2通道配置为输出:
CCR2是装入当前捕获/比较2寄存器的值(预装载值)。
如果在TIMx_CCMR2寄存器(OC2PE位)中未选择预装载特性,其始终装入当前寄存器中。
否则,只有当更新事件发生时,此预装载值才装入当前捕获/比较2寄存器中。
当前捕获/比较寄存器包含了与计数器TIMx_CNT比较的值,并且在OC端口上输出信号。
若CC2通道配置为输入:
CCR2包含了由上一次输入捕获2事件(IC2)传输的计数器值。
1
//实验方法:
请您连接好串口调试助手,注意:Baud Rate is 19200
在PA1口输入您的PWM信号,
在上位机后由到一些信息:
The IC2[1] is 6107 The IC1[1] is 4828
The Duty is 79
The Frequency is 589 ,This is the 1 Pulse
The IC2[2] is 6028 The IC1[2] is 1740
The Duty is 28
The Frequency is 597 ,This is the 2 Pulse
The IC2[3] is 6062 The IC1[3] is 1780
The Duty is 29
The Frequency is 593 ,This is the 3 Pulse
The IC2[4] is 6106 The IC1[4] is 4807
The Duty is 78
The Frequency is 589 ,This is the 4 Pulse
The IC2[5] is 6020 The IC1[5] is 1757
The Duty is 29
The Frequency is 5*** ,This is the 5 Pulse
相信你自己试一下就明白了 ,如果想知道的很清楚,请您自己看一下资料。
近期下载者:
相关文件:
收藏者: