time3.文件如下
#include "time3.h"
#include "sys.h"
#include "stdio.h"
#include "gpio.h"
/**************************************************************
*名 称:TIM3_Int_Init()
*功 能:定时器初始化函数
*输 入:无
*输 出:无
*说 明:非通用定时器3挂时钟总线2上,其余通用定时器2345挂在时钟总线1上
定时时间计算公式: Tout(定时时间) = (arr + 1)* (psc +1 ) /72MHz
**************************************************************/
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟总线使能
//TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重载计数周期值 arr
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置分频系数 (预分频数) psc
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数方式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //打开定时器3并初始化
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //更新中断(定时器号,中断类型,使能)
//中断优先级 NVIC 设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 0 级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级 3 级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化 NVIC 寄存器
TIM_Cmd(TIM3, ENABLE); //使能定时器3并打开
}
/****************************************************************************************
*名 称:TIM3_IRQHandler()
*功 能:定时器3中断服务函数
*输 入:无
*输 出:无
*说 明:定时器是指在设定完时间之后,每隔设定的时间进入一次中断
在执行完中断之后回到主函数继续执行
****************************************************************************************/
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查 TIM3 更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除 TIM3 更新中断标志
TIM_Cmd(TIM2, ENABLE);
SERVO0=1;
}
}
time2.c文件如下
#include "time2.h"
#include "sys.h"
#include "stdio.h"
#include "gpio.h"
/**************************************************************
*名 称:TIM2_Int_Init()
*功 能:定时器初始化函数
*输 入:无
*输 出:无
*说 明:非通用定时器1挂时钟总线2上,其余通用定时器2345挂在时钟总线1上
定时时间计算公式: Tout(定时时间) = (arr + 1)* (psc +1 ) /72MHz
**************************************************************/
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟总线使能
//TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重载计数周期值 arr
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置分频系数 (预分频数) psc
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数方式,向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //打开定时器2并初始化
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //更新中断(定时器号,中断类型,使能)
//中断优先级 NVIC 设置
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级 0 级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级 2 级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化 NVIC 寄存器
// TIM_Cmd(TIM2, ENABLE); //使能定时器2并打开
}
/********************************************************************************
*名 称:Timer2ARRValue()
*功 能:TIM2赋初值函数
*输 入:无
*输 出:无
*说 明:通过改变arr的值来改变占空比
*********************************************************************************/
//void Timer2ARRValue(u16 arr)
//{
//
// TIM2->ARR = arr + 1;
//}
/****************************************************************************************
*名 称:TIM2_IRQHandler()
*功 能:定时器2中断服务函数
*输 入:无
*输 出:无
*说 明:定时器是指在设定完时间之后,每隔设定的时间进入一次中断
在执行完中断之后回到主函数继续执行
在TIM2中断中关闭GPIO口的输出,拉低电平
****************************************************************************************/
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查 TIM2 更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中断标志
TIM_Cmd(TIM2, DISABLE); //关闭TIM2的使能
SERVO0=0;
}
}
SERVO0定义了一个GPIO口
主函数如下
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init();
TIM2_Int_Init(1999,7199); //Tout = ((arr+1)*(psc+1))/Tclk ; 10ms
TIM3_Int_Init(999,7199);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
GPIO_Inite();
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}
我想用两个定时器交叉搭配是用输出PWM 波,现在不知道为什么不能用,请高手帮忙看一下程序那个地方不对,谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
PWM频率不对?
占空比,频率,是多少?符合舵机驱动条件么?
一周热门 更多>