OpenEdv-开源电子网

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

用TIM1定时器产生4路独立的PWM波

[复制链接]

4

主题

16

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-9-2
在线时间
11 小时
发表于 2017-9-2 08:43:14 | 显示全部楼层 |阅读模式
6金钱
请问,怎么设置才能使TIM1里的CH1 CH1N CH2N CH3N这四个通道产生的PWM波是独立的呢
下面这个代码是我根据正点原子PWM实验里面改出来的,


void TIM1_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); //时钟使能

        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

        TIM_Cmd(TIM1, ENABLE);  //使能TIMx外设
                                                         
}
void PWM_Init(u16 arr,u16 psc)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure2;
        TIM_OCInitTypeDef  TIM_OCInitStructure1;
        TIM_OCInitTypeDef  TIM_OCInitStructure3;
       

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);        //使能定时器3时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; //TIM_CH1N TIM_CH2N TIM CH3N
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

   //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_ARRPreloadConfig(TIM1, ENABLE);
        //初始化TIM3 Channel2 PWM模式         
        TIM_OCInitStructure2.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure2.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
        TIM_OCInitStructure2.TIM_OCNPolarity = TIM_OCNPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC2Init(TIM1, &TIM_OCInitStructure2);  //根据T指定的参数初始化外设TIM3 OC2
       
                TIM_OCInitStructure1.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure1.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
        TIM_OCInitStructure1.TIM_OCNPolarity = TIM_OCNPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OCInitStructure1.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure1.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM1, &TIM_OCInitStructure1);  //根据T指定的参数初始化外设TIM3 OC2
       
                TIM_OCInitStructure3.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure3.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
        TIM_OCInitStructure3.TIM_OCNPolarity = TIM_OCNPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC3Init(TIM1, &TIM_OCInitStructure3);  //根据T指定的参数初始化外设TIM3 OC2

        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
        TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
        TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);

        TIM_Cmd(TIM1, ENABLE);  //使能TIM3
  TIM_CtrlPWMOutputs(TIM1,ENABLE);
}






int main(void)
{
         u8 a=1;
u8 b=0;
         delay_init();
         PWM_Init(1439,0);
        while(1)
         {
                 delay_ms(50);
                 
                // TIM_SetCompare1(TIM1,720);
         if(b) a--;
         else a++;
   if (a==3)b=1;
  if (a==1)b=0;
         
                 if (a==1) TIM_SetCompare1(TIM1,720);
         else TIM_SetCompare1(TIM1,0);
         if (a==2) TIM_SetCompare2(TIM1,720);
         else TIM_SetCompare2(TIM1,0);
                 if (a==3) TIM_SetCompare3(TIM1,720);
         else TIM_SetCompare3(TIM1,0);
       
                 
         }
}


这个主函数最后软件模拟出来的结果是下面这个
CH1N CH1通道互补输出,但是满足主函数里的条件,CH2N CH3N则一直是高电平。
我应该是设置的不对,请问CH1 CH1N CH2N CH3N独立作为PWM输出的库函数是怎么写的,CH2 CH3通道可以不设置吗,还是说一定要设置呢。
萌新初学,求助


H6DR2]DS@(%OHN5[SVI~F3V.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2017-9-2
在线时间
11 小时
 楼主| 发表于 2017-9-2 11:28:42 | 显示全部楼层
TIM_OCInitStructure2.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM_OCInitStructure2.TIM_OutputNState = TIM_OutputNState_Enable; //比较输出使能
        TIM_OCInitStructure2.TIM_OCNPolarity = TIM_OCNPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OCInitStructure2.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure2.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC2Init(TIM1, &TIM_OCInitStructure2);

原先程序的基础上我加入了CH2通道状态的一些设置,但是不将CH2通道的GPIO初始化,CH2N就能出波形了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-9-2 21:28:13 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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