你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103的PWM输出疑问

[复制链接]
liweizhang 提问时间:2018-1-24 14:37 /
大家好!现在使用stm32f103调试一个小程序,注意到:(1)stm32F103的pwm输出高于1Hz时,波形正常。
(2)输出好像不能低于1Hz,注意到当低于1Hz时,只有半个周期的计时是准确的;


这是怎么回事呢?麻烦帮助一下啊,多谢啦!!!


下面是pwm的代码。

void TIM3_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        /*GPIOA Configuration: TIM3 channel 4 as alternate function push-pull*/
        
        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;//| GPIO_Pin_1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
}


void TIM3_Configuration(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
  /* Time base configuration */
  /*定义TIM3工作在1KHz,TIM3预分频到36MHz,在预装载到1KHz*/         
  TIM_TimeBaseStructure.TIM_Period = 10000-1;//0xea5f;       //当定时器从0计数到999,即为1000次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 72-1;//2;//TIM3Prescaler;            //设置预分频:不预分频,即为36MHz
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;        //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 5000;        //设置通道3的电平跳变值,输出另外一个占空比的PWM
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCNPolarity_High
  TIM_OC3Init(TIM3, &TIM_OCInitStructure);         //使能通道4
  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_ARRPreloadConfig(TIM3, ENABLE);                         // 使能TIM3重载寄存器ARR
  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                   //使能定时器3

//TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);
//TIM_SetAutoreload(TIM2, 0xFFFF); //设置溢出中断比较值         
   //TIM_ITConfig(TIM3, TIM_IT_Update,  ENABLE ); //设置溢出中断        
}

void NVIC_TIME3_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        //打开TIM2的全局中断,在中断中判断是更新中断还是捕捉中断
        /* Enable the TIM2 global Interrupt */
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void TIM3_Init(void)
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
        TIM3_GPIO_Config();
        TIM3_Configuration();
        NVIC_TIME3_Configuration();        

        TIM3_HzOut.hzOut = 100;
        TIM3_HzOut.hzOut_decimal = 0;
        TIM3_HzOut.ratio = 50;
        //tim3_ratio = 50;//默认的占空比是50%
        //tim3_hzOut = 100;//默认输出100Hz的脉冲波;
        //tim3_hzOut_decimal = 0;//默认小数是0.0hz;
        
//        TIM3_HzOut.duty_ratio = 50;//默认的占空比是50%;
        
}

收藏 评论15 发布时间:2018-1-24 14:37

举报

15个回答
morphlings2014 回答时间:2018-1-24 15:17:50
单看这程序,GPIO时钟,复用功能时钟都没开。
其他配置看起来好像没问题。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

Inc_brza 回答时间:2018-1-24 15:40:12
输出肯定可以到达1hz的。
楼主注意两个点,第一个是时钟分频,第二个是计数装载值。
要实现1hz输出,首先单纯不分频靠计数是不可能的。
1、假设定时器始终分频之1~65536
2、假设定时器是16bit的,也就是0~65535
假设定时器输入时钟为72Mhz
example:
分频值 = 36000,
clk = 72000 000 / 36 000 = 2000hz
预装值 = 2000
time = 1 / 2000 * 2000 = 1s
这个就是楼主要的1hz了吧?

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

wenyangzeng 回答时间:2018-1-24 15:44:11
本帖最后由 wenyangzeng 于 2018-1-24 18:52 编辑

GPIOB时钟没有打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
根据楼主的代码试了一下,PWM输出是100HZ,而不是1HZ。

无标题.png


评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

liweizhang 回答时间:2018-1-24 15:48:18
Inc_brza 发表于 2018-1-24 15:40
输出肯定可以到达1hz的。
楼主注意两个点,第一个是时钟分频,第二个是计数装载值。
要实现1hz输出,首先单 ...

非常感谢回复!
之前我尝试过,将时钟分频值设置为14400,即:将输入频率分频至5KHz.
预装值设置为10000,应该输出0.5Hz。实际上通过示波器观察到,没有任何波形输出。
toofree 回答时间:2018-1-24 15:58:23
输出低于1Hz是没问题的,还得从自己的程序中找问题。
定时器是硬件,它根本不关心你是不是低于1Hz,只要你预分频系数TIM_Prescaler、计数器周期值 TIM_Period设置合适,就足够了。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

liweizhang 回答时间:2018-1-24 16:03:40
wenyangzeng 发表于 2018-1-24 15:44
GPIOB时钟没有打开
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
根据楼主的代码试了一下,PWM输 ...


非常感谢帮助。
麻烦您试一下,将分频值设置为144000-1,
预装值设置为10000-1,理论上应该输出0.5Hz。之前我用示波器观察了一下,没有任何波形输出的。
wenyangzeng 回答时间:2018-1-24 16:03:52
修改一下参数:
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
1HZ的输出貌似正常呀,也没有用的定时中断。
无标题.png
liweizhang 回答时间:2018-1-24 16:05:17
toofree 发表于 2018-1-24 15:58
输出低于1Hz是没问题的,还得从自己的程序中找问题。
定时器是硬件,它根本不关心你是不是低于1Hz,只要你 ...

多谢啦,我再看看程序哪里有设置错了
wenyangzeng 回答时间:2018-1-24 16:08:11
liweizhang 发表于 2018-1-24 16:05
多谢啦,我再看看程序哪里有设置错了

TIME_3.rar (848 Bytes, 下载次数: 4)
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版