OpenEdv-开源电子网

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

利用TIM1输出PWM波,怎么设置PWM波不使能时,该IO口输出极性

[复制链接]

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2016-7-5
在线时间
34 小时
发表于 2016-10-13 15:27:23 | 显示全部楼层 |阅读模式
5金钱
    大家好!我使用的芯片是stm8s103f3P,利用TIM1输出PWM波,怎么设置PWM波不使能时,该IO口输出极性?现在的现象是:高低电平轮流出现。TIM的设置如下:
TIM1_DeInit();  
  TIM1_TimeBaseInit(3, TIM1_COUNTERMODE_UP, 99, 0x00);//40K   
  TIM1_OC1Init(TIM1_OCMODE_PWM2, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_ENABLE, 49, TIM1_OCPOLARITY_LOW, TIM1_OCNPOLARITY_HIGH, TIM1_OCIDLESTATE_SET, TIM1_OCNIDLESTATE_SET);
  TIM1_CCxCmd(TIM1_CHANNEL_1, ENABLE);  
  TIM1_OC1PreloadConfig(ENABLE);  
  TIM1_CtrlPWMOutputs(ENABLE);  
  TIM1_Cmd(DISABLE);

  大家帮帮忙,谢谢了!

最佳答案

查看完整内容[请看2#楼]

我不用库函数模式,给你个TIM2的参考,希望能帮助到你 #define PWM_20K void init_timer2(void) { TIM2_CR1 = 0; TIM2_CCMR3 = 0b01010000; //通道3配置为PWM模式2,初始化强制为(L) TIM2_CCER2 = 0b00000011; //通道3:低电平输出有效,信号输出到对应端口 0b00000011 //初始化自动装载寄存器,决定PWM方波的频率 //TIM2_ARR = fmaster/Fpwm //2/0.250=8 16/0.250=64(0x40) 16/0.10=160(0xA0) 16/0.01=1600(0x64 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-10-27
在线时间
4 小时
发表于 2016-10-13 15:27:24 | 显示全部楼层
我不用库函数模式,给你个TIM2的参考,希望能帮助到你

#define PWM_20K
void init_timer2(void)
{
        TIM2_CR1 = 0;

        TIM2_CCMR3 = 0b01010000;        //通道3配置为PWM模式2,初始化强制为(L)
        TIM2_CCER2 = 0b00000011;        //通道3:低电平输出有效,信号输出到对应端口 0b00000011

  //初始化自动装载寄存器,决定PWM方波的频率
        //TIM2_ARR = fmaster/Fpwm
  //2/0.250=8 16/0.250=64(0x40) 16/0.10=160(0xA0) 16/0.01=1600(0x640) 16/0.001=16000(0x3E80)
  //16/1216(0x4C0)=0.013158 16/1067(0x42B)=0.014995 16/0.02=800(0x320) 16/0.05=320(0x140)
  //16/0.01=1600(640) 16/(1/(3.5*20))=1120(0x460)
        #ifdef PWM_100K
          TIM2_ARRH = 0x00;        //自动重载寄存器,160
          TIM2_ARRL = 0xA0;
                #define TIM2_CH3_PWM_DUTYS 16        //10%占空比值,赋占空比,可直接(TIM2_CH3_PWM_DUTYS*十分比),如:30%占空比=TIM2_CH3_PWM_DUTYS*3
  #endif
        #ifdef PWM_50K
          TIM2_ARRH = 0x01;        //自动重载寄存器,320
          TIM2_ARRL = 0x40;
                #define TIM2_CH3_PWM_DUTYS 32
  #endif
        #ifdef PWM_20K
          TIM2_ARRH = 0x03;        //自动重载寄存器,800
          TIM2_ARRL = 0x20;
                #define TIM2_CH3_PWM_DUTYS 80
  #endif
        #ifdef PWM_14K
          TIM2_ARRH = 0x04;        //自动重载寄存器,1120
          TIM2_ARRL = 0x60;
                #define TIM2_CH3_PWM_DUTYS 112
  #endif
        #ifdef PWM_10K
          TIM2_ARRH = 0x06;        //自动重载寄存器,1600
          TIM2_ARRL = 0x40;
                #define TIM2_CH3_PWM_DUTYS 160
  #endif

        //决定PWM方波的占空比
        TIM2_CCR3H = TIM2_CCR3L = 0;
        //设置分频系数
        TIM2_PSCR = 0;

        //TIM2_IER = 0b00000001;        //允许更新使能中断,在每个频率周期中断,中断时间-50K:20us
        CLK_PCKENR1 |= 0b00100000;        //使能TIM2时钟,时钟在过程不能关闭,关闭必须重新初始化,否则不能启动
}

void Start_Timer2_CH3_PWM(void)
{
        TIM2_CCR3H = (uchar)(iTimer2Ch3Duty>>8);
        TIM2_CCR3L = (uchar)(iTimer2Ch3Duty);

        TIM2_CCMR3 = 0b01111000;        //通道3配置为PWM模式2 0b01111000

        //TIM2_IER = 0b00000001;        //允许更新使能中断,在每个频率周期中断
        TIM2_CR1 = 0b10000001;        //使能定时器
}

void Stop_Timer2_CH3_PWM(void)
{
        TIM2_CCMR3 = 0b01010000;        //通道3配置为PWM模式2,初始化强制为(L)

        TIM2_IER = 0;
        TIM2_CR1 = 0;        //定时器
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2016-10-14 20:18:51 | 显示全部楼层
貌似有个强制输出,你去看看设置下OK不
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2016-6-28
在线时间
5 小时
发表于 2016-10-28 21:23:27 | 显示全部楼层
要不硬件上加上拉电阻或者下拉电阻试试?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-9-29 05:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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