新手入门
- 积分
- 14
- 金钱
- 14
- 注册时间
- 2020-9-29
- 在线时间
- 2 小时
|
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波形
}
|
|