本帖最后由 亦辰 于 2017-12-23 14:28 编辑
是这样的 就想通过定时器模拟下pwm波,就用坛友说的用两个定时器的思路来做,但是始终产生不了固定周期频率可变的PWM波,希望坛友帮忙找下问题,困惑几天了,具体代码如下
//主函数部分
int main(void)
{
u8 dir=1; //捕获方向参数
u16 Tim3pwmval=100;
u16 Tim4pwmval;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
LED_Init(); //初始化LED
TIM3_Init(500-1,108-1); //108M/108=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
while(1)
{
if (Tim3_ringflag)
{
if (dir)
{
Tim3pwmval++; //dir==1 led0pwmval递增
}
else
{
Tim3pwmval--; //dir==0 led0pwmval递减
}
if (Tim3pwmval>300)
{
dir=0; //led0pwmval到达300后,方向为递减
}
if (Tim3pwmval==0)
{
dir=1; //led0pwmval递减到0后,方向改为递增
}
Tim4pwmval=500-Tim3pwmval;
HAL_TIM_Base_Stop(&TIM3_Handler);
HAL_TIM_Base_DeInit(&TIM3_Handler);
TIM4_Init( Tim4pwmval,108-1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET); //PB1置0
Tim3_ringflag=0;
}
else if (Tim4_ringflag)
{
HAL_TIM_Base_Stop(&TIM4_Handler);
HAL_TIM_Base_DeInit(&TIM4_Handler);
TIM3_Init( Tim3pwmval,108-1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET); //PB1置1
Tim4_ringflag=0;
}
else
{
;
}
}
}
//定时器和中断函数部分 PB1配置过了的
TIM_HandleTypeDef TIM3_Handler; //定时器句柄
TIM_HandleTypeDef TIM4_Handler; //定时器句柄
int Tim3_ringflag; //中断标志位
int Tim4_ringflag;
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler=psc; //分频
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM3_Handler.Init.Period=arr; //自动装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE
}
void TIM4_Init(u16 arr,u16 psc)
{
TIM4_Handler.Instance=TIM4; //通用定时器4
TIM4_Handler.Init.Prescaler=psc; //分频
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM4_Handler.Init.Period=arr; //自动装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM4_Handler);
HAL_TIM_Base_Start_IT(&TIM4_Handler); //使能定时器4和定时器4更新中断:TIM_IT_UPDATE
}
//定时器底册驱动,开启时钟,设置中断优先级】
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if (htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
if (htim->Instance==TIM4)
{
__HAL_RCC_TIM4_CLK_ENABLE(); //使能TIM4时钟
HAL_NVIC_SetPriority(TIM4_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM4_IRQn); //开启ITM4中断
}
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
//定时器4中断服务函数
void TIM4_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM4_Handler);
}
//定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim==(&TIM3_Handler))
{
Tim3_ringflag=1;
}
else if (htim==(&TIM4_Handler))
{
Tim4_ringflag=1;
}
else
{
;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>