打印

STM8S003,在用TIM2做PWM输出失败

[复制链接]
11185|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanggang1234|  楼主 | 2013-10-14 21:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我在调试TIM2,从TIM2_CH2管脚输出PWM,可是调试很久,PWM都没有出来,管脚上给出的一直是高电平,请教原因,谢谢!
沙发
huanggang1234|  楼主 | 2013-10-15 07:37 | 只看该作者
我的程序如下,请高手指点,多谢!
void INIT_TIMER(void)
{
//   TIM2_CCMR1 = TIM2_CCMR1 | 0x68;  // Output mode PWM1.         
   TIM2_CCMR2 = TIM2_CCMR2 | 0x68;// 通道1被设置成比较输出方式
                                    // OC2M = 110,为PWM模式1,
   TIM2_CCER1 = TIM2_CCER1 | 0x30;  // CC polarity low,enable PWM output      
                                    // CC1P = 1,低电平为有效电平
                                    // CC1E = 1,开启输出引脚
   // 初始化自动装载寄存器,决定PWM方波的频率,Fpwm=1000000/1000=1Khz      
   TIM2_ARRH = 0x03;  // 自动重载寄存器ARR=0x03e8=1000
   TIM2_ARRL = 0xe8;  // 每记数500次产生一次中断,即1000ms
   // 初始化比较寄存器,决定PWM方波的占空比            
   TIM2_CCR1H = 0x00;
   TIM2_CCR1L = 0x00;
   // 初始化时钟分频器为1,即计数器的时钟频率为Fmaster=8Mhz/2*2*2=1000000
   TIM2_PSCR = 0x03;
   // 启动计数
   TIM2_CR1 = TIM2_CR1 | 0x01;
}
void main(void)
{
   INIT_OSC();
   INIT_GPIO();
   INIT_TIMER();       
   while (1)
   {
      // ------------------GPIO测试代码----------------------------------------
   //   PC_ODR ^= 0xe0;
   //   delay_ms(2000);
      // ------------------定时器测试代码--------------------------------------
   //   while ((TIM1_SR1 & 0x01) == 0x00);  // 等待更新标志
   //   TIM1_SR1 = 0x00;                    // 清除更新标志
   //   PC_ODR ^= 0xe0;                     // LED驱动信号取反
                                            // LED闪烁频率=2MHZ/128/2000/2=3.90625
      // ------------------PWM测试代码--------------------------------------                                         
      TIM2_CCR1H = 0x01;
      TIM2_CCR1L = 0xf4;
   }
}

使用特权

评论回复
板凳
ldh119| | 2013-12-16 17:05 | 只看该作者
TIM2_CCMR2 = TIM2_CCMR2 | 0x68;// 通道1被设置成比较输出方式
貌似不对。

使用特权

评论回复
地板
cjhk| | 2013-12-16 19:06 | 只看该作者
设置的通道好像是错的   楼主

使用特权

评论回复
5
cjhk| | 2013-12-16 19:06 | 只看该作者
设置的通道好像是错的   楼主

使用特权

评论回复
6
timyc0511| | 2014-5-8 21:37 | 只看该作者
TIM2_CCR2H = 0x01;
TIM2_CCR2L = 0xf4;      重点在2

使用特权

评论回复
7
icecut| | 2014-5-9 09:58 | 只看该作者
lz消失了..不道德啊

使用特权

评论回复
8
shilinlin0321| | 2014-6-23 15:11 | 只看该作者
我也碰到这种情况了,该如何解决啊

使用特权

评论回复
9
shilinlin0321| | 2014-6-24 08:52 | 只看该作者
俺也出现这个问题,代码如下:



/* 定时器2的通道1设置成PWM输出方式,PD4用PWM输出驱动LED*/

#include "stm8s.h" //包含用到的外设的头文件
#include <iostm8s103F3.h>
unsigned int CCR1_Val = 300;

void Delay(unsigned int time)
{
        volatile unsigned int i;
        while(time--){
                i=300;
                while(i--);
        }
}

void TIM2_PWM_INIT(void)
{
        TIM2_TimeBaseInit(TIM2_PRESCALER_1, 1000);//预分频1,自动装载值0x018F(PWM频率=8M/0x00FF=31372.549Hz)
        TIM2_SelectOCxM(TIM2_CHANNEL_1, TIM2_OCMODE_PWM2);//选择TIM2输出比较模式---通道1,PWM模式1
        TIM2_CCxCmd(TIM2_CHANNEL_1, ENABLE);   //输入捕捉输出比较通道1使能
        TIM2_Cmd(ENABLE);//启动定时器2
}

void CLK_init(void)
{       
        CLK_HSICmd(ENABLE);    //启动内部高速振荡器
        CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV2); //配置系统时钟分频器(内部高速振荡器2分频=8M)
}

void GPIO_init(void)
{
        GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);
}

void main(void)
{
        unsigned int PWM_value=0;
        CLK_init();
        GPIO_init();
        TIM2_PWM_INIT();

        while(1)
        {
                Delay(10); //延时
                TIM2_SetCompare3(PWM_value++); //改变PD4输出的PWM的占空比,
                if(PWM_value>1000)PWM_value=0; //当占空比大于某一个值时,复位PWM_value
        }  
}
//-----------End Of File-------------------

求解

使用特权

评论回复
10
shilinlin0321| | 2014-6-24 08:57 | 只看该作者
如果用TIM1的话,只要多一行代码:TIM1_CtrlPWMOutputs(ENABLE);就可以了,其他的完全一样,不知道是不是这样代码造成的TIM2无法输出PWM?

使用特权

评论回复
11
BryanChang| | 2014-6-24 09:20 | 只看该作者
看看PWM输出是不是引脚的备用功能,如果是需要OPTION BYTE配置一下.

使用特权

评论回复
12
shilinlin0321| | 2014-6-24 11:01 | 只看该作者
那个option byte都已经设置过了

使用特权

评论回复
13
高江| | 2014-8-20 11:27 | 只看该作者
我也PWM无输出,发现写不入寄存器,还找不到能正确写入的方法,不知为什么
void TIM2_Init(void)
{
   TIM2_ARRH = 0x27;  //设定重装载值      
   TIM2_ARRL = 0x10;  //
   TIM2_CCR1H = 0;  //设置占空比
  TIM2_CCR1L = 20;  //
   TIM2_CCER1 = 0x01;  //高电平有效,开启输出
  TIM2_CCMR1 = 0x68;   ////PWM模式1;通道2PWM输出
  TIM2_CR1 = 0x01;  //计数使能
}
写入寄存器后结果
TIM2_ARRH =0x00
TIM2_ARRL = 0x14
TIM2_CCR1H = 0x00
TIM2_CCR1L = 0x00
TIM2_CCER1 = 0x00
TIM2_CCMR1 = 0x00
TIM2_CR1 = 0x01;  

使用特权

评论回复
14
dream397942797| | 2017-11-4 23:27 | 只看该作者
asm("rim");

使用特权

评论回复
15
xiaobai1号| | 2019-7-13 17:09 | 只看该作者
huanggang1234 发表于 2013-10-15 07:37
我的程序如下,请高手指点,多谢!
void INIT_TIMER(void)
{

请问您,这个问题解决了吗。我也是遇到同样的问题了

使用特权

评论回复
16
xiaobai1号| | 2019-7-14 09:49 | 只看该作者
shilinlin0321 发表于 2014-6-24 08:52
俺也出现这个问题,代码如下:

请问您这个问题解决了吗,我也遇到同样的问题

使用特权

评论回复
17
清水煮茗| | 2019-9-25 17:09 | 只看该作者
我也是这样,一直TIM2_CH1(PD4引脚)一直输出高电平,检查发现在stm8s.h里面没有选择芯片:

/* Uncomment the line below according to the target STM8S or STM8A device used in your
   application. */

/* #define STM8S208 */      /*!< STM8S High density devices with CAN */
  //#define STM8S207      
/* #define STM8S007 */      /*!< STM8S Value Line High density devices */
/* #define STM8AF52Ax */    /*!< STM8A High density devices with CAN */
/* #define STM8AF62Ax */    /*!< STM8A High density devices without CAN */
/* #define STM8S105 */      /*!< STM8S Medium density devices */
/* #define STM8S005 */      /*!< STM8S Value Line Medium density devices */
/* #define STM8AF626x */    /*!< STM8A Medium density devices */
/* #define STM8AF622x */    /*!< STM8A Low density devices */
/* #define STM8S103 */      /*!< STM8S Low density devices */
  #define STM8S003       /*!< STM8S Value Line Low density devices */
/* #define STM8S903 */      /*!< STM8S Low density devices */

将用的#define STM8S003的注释符号去掉,再编译下载,就可以正常输出了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

18

帖子

1

粉丝