2019-07-21 08:07发布
banxiafeixia 发表于 2018-10-31 09:27 不嫌麻烦的话,初始化定时器,设置成一秒进入几十K次的中断,挨个设定翻转的时间。有点麻烦,但是可行。
wangmingwei093 发表于 2018-10-31 11:37 定时器翻转一路最快也就500K的频率,5路更低,要求不高的话确实可以。
十0二 发表于 2018-10-31 19:20 比如说用TIM3吧 这个时钟可以送给4个通道 然后你要找到这4个通道对应的io口具体步骤我也一下子说不完你看我 ...
最多设置5个标签!
感谢指教!
频率刷新不是特别快,小于10KHz以内,但是要求精度角度,最好相对误差低于1Hz。
感谢指教!
频率刷新不是特别快,小于10KHz以内,但是要求精度角度,最好相对误差低于1Hz。
#include "pwm.h"
// * 函数名:TIM3_PWM_Init()
// * 描述 :初始化
// * 输入 :无
// * 输出 :无
// * 调用 :内部调用数
void TIM3_PWM_Init(void)
{
TIM3_GPIO_Config();
TIM3_MODE_Config();
}
// * 函数名:TIM3_GPIO_Config()
// * 描述 :配置TIM3输出的PWM信号的模式,如周期、极性、占空比初始化
// * 输入 :无
// * 输出 :无
// * 调用 :内部调用
static void TIM3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //复用功能:使能定时器3;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
//设置该引脚为复用输出功能,输出TIM3 CH1,CH2,CH3,CH4的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
}
// * 函数名:TIM3_MODE_Config()
// * 描述 :配置TIM3输出的PWM信号的模式,如周期、极性、
// * 输入 :无
// * 输出 :无
// * 调用 :内部调用数
static void TIM3_MODE_Config(void)
{
//初始化TIM3
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = 999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =0; //设置用来作为TIMx时钟频率除数的预分频值
//TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel234 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR3上的预装载寄存器
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC4
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR4上的预装载寄存器
TIM_ARRPreloadConfig(TIM3, ENABLE); // 使能TIM3重载寄存器ARR
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
// * 函数名:TIM3_Set_pwm(u16 pwm1,u16 pwm2,u16 pwm3,u16 pwm4)
// * 描述 :设置TIM3的4个通道的pwm占空比
// * 输入 :u16 pwm1,u16 pwm2,u16 pwm3,u16 pwm4
// * 输出 :无
// * 调用 :内部调用数
void TIM3_Set_pwm(u16 pwm1,u16 pwm2,u16 pwm3,u16 pwm4)
{
TIM_SetCompare1(TIM3,pwm1);
TIM_SetCompare2(TIM3,pwm2);
TIM_SetCompare3(TIM3,pwm3);
TIM_SetCompare4(TIM3,pwm4);
}
额,非常感谢阁下
不过,我看你的程序,似乎这个改变的是各个通道的占空比,并不能独立改变各个通道的PWM的频率(其实我的程序是在msp430上跑的,但无奈msp430专题太冷清,所以你的程序我没有实际验证)。
不知道我的说法是否正确,还请指教!
一周热门 更多>