OpenEdv-开源电子网

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

求问:PWM输出初始化,在TIM2和TIM4上,增加了TIM1和TIM3,但是TIM1和TIM3一直是低电平

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-9-29
在线时间
2 小时
发表于 2020-10-9 11:24:18 | 显示全部楼层 |阅读模式
5金钱
#include "main.h"


//PWM初始化 //频率为:72*10^6/(arr+1)/(psc+1)
void PWM_Init(u16 arr,u16 psc)
{
       
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定义定时器初始化结构体
        TIM_OCInitTypeDef  TIM_OCInitStructure;//定义结构体
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);//开总线时钟
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);//TIM2完全重映射
        GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE);//TIM4部分重映射
       
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);//TIM1部分重映射
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);//TIM3完全重映射
       

        //初始化PB10作为推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TIM2_CH3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化引脚
        //初始化PD12作为推挽输出
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //TIM4_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化引脚
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //TIM1_CH4
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化引脚
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM3_CH4
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化引脚
       
        //初始化定时器2与4
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2与4时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器2与4时钟
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器3与1时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3与1时钟
       
        //初始化TIM2与TIM4
        TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载寄存器的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //TIMX预分频的值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据以上功能对定时器2进行初始化
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据以上功能对定时器4进行初始化
       
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据以上功能对定时器1进行初始化
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据以上功能对定时器3进行初始化       
       
        //设置为PWM模式
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
        TIM_OC3Init(TIM2, &TIM_OCInitStructure);//根据结构体信息进行初始化
        TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);  //使能定时器TIM2在CCR3上的预装载值?
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);//根据结构体信息进行初始化
        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能定时器TIM4在CCR4上的预装载值、
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
        TIM_OC1Init(TIM1, &TIM_OCInitStructure);//根据结构体信息进行初始化
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能定时器TIM1在CCR4上的预装载值、
       
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择定时器模式,TIM脉冲宽度调制模式2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出比较极性低
       TIM_OC1Init(TIM3, &TIM_OCInitStructure);//根据结构体信息进行初始化
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能定时器TIM3在CCR4上的预装载值、       
       
        TIM_Cmd(TIM2, ENABLE);  //使能定时器TIM2
        TIM_Cmd(TIM4, ENABLE);  //使能定时器TIM4
       
        TIM_Cmd(TIM1, ENABLE);  //使能定时器TIM1
        TIM_Cmd(TIM3, ENABLE);  //使能定时器TIM3
       
        WatPump1_Set(2);
        WatPump2_Set(3);
       
        WatPump3_Set(2);
        WatPump4_Set(3);
       
}
//水泵控制1
void WatPump1_Set(u8 set)
{
        if(set==0)
                TIM_SetCompare1(TIM4,0);
        else
          TIM_SetCompare1(TIM4,set*1000);//得到占空比的pwm波形
}
//水泵控制2
void WatPump2_Set(u8 set)
{
        if(set==0)
                TIM_SetCompare3(TIM2,0);
        else
          TIM_SetCompare3(TIM2,set*1000);//得到占空比的pwm波形
}




//水泵控制3
void WatPump3_Set(u8 set)
{
        if(set==0)
                TIM_SetCompare4(TIM1,0);
        else
          TIM_SetCompare4(TIM1,set*1000);//得到占空比的pwm波形
}
//水泵控制4
void WatPump4_Set(u8 set)
{
        if(set==0)
                TIM_SetCompare4(TIM3,0);
        else
          TIM_SetCompare4(TIM3,set*1000);//得到占空比的pwm波形
}


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

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-9-29
在线时间
2 小时
 楼主| 发表于 2020-10-9 11:27:06 | 显示全部楼层
TIM2和TIM4一直是可以通过改变set值控制,但是TIM1和TIM3不行,一直是低电平
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-17 10:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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