OpenEdv-开源电子网

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

PWM实验,输出高低电平为什么是反的?

[复制链接]

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-9
在线时间
6 小时
发表于 2020-4-25 01:29:09 | 显示全部楼层 |阅读模式
1金钱
本实验使用 PB1/TIM3_CH4作为PWM的输出引脚*/

/* TIMx:定时器。arr:自动装载值。prescale:预分频值。pulse比较值,写CCRx*/
void Init_PWM(TIM_TypeDef *TIMx, uint16_t arr, uint16_t prescale)
{
        GPIO_InitTypeDef GPIO_InitStruct;
    TIM_TimeBaseInitTypeDef TIM_Structure;
    TIM_OCInitTypeDef   TIM_OCInitStruct;
       
         if(TIMx == TIM3){

                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
                //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);                 
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);                   
               
                /*将 PB1 定义为TIM3_CH4的输出通道*/
                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStruct);  
                  
               
                /*定时器3初始化*/
        TIM_Structure.TIM_Period = arr-1;//自动装载值
        TIM_Structure.TIM_Prescaler = prescale-1;//分频值
        TIM_Structure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频因子
        TIM_Structure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
        TIM_TimeBaseInit(TIMx, &TIM_Structure);//定时器初始化

                 /*初始化TIM3 Channel4 PWM模式*/
                TIM_OCInitStruct.TIM_OCMode      = TIM_OCMode_PWM2; //PEM模式2,CNT>CCR时输出高电平
                TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;   
                TIM_OCInitStruct.TIM_Pulse       = arr/2-1;
                TIM_OCInitStruct.TIM_OCPolarity  = TIM_OCPolarity_High;//输出极性高
       
        TIM_OC4Init(TIMx, &TIM_OCInitStruct);
               
                /*使能输出比较预装载*/
        TIM_OC4PreloadConfig(TIMx, TIM_OCPreload_Enable);  
               
                /*允许或禁止在定时器工作时向ARR的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值。*/
                TIM_ARRPreloadConfig(TIMx, ENABLE);
               
                /* 使能定时器的输出*/
                TIM_CtrlPWMOutputs(TIMx, ENABLE);
               
                /*使能定时器 */
        TIM_Cmd(TIMx, ENABLE);         
                 
         }


int main(void)
{

        Init_PWM(TIM3,36000,1);

   while (1)
    {
                TIM_SetCompare4(TIM3,36000/4);

    }
}

为什么输出的波形仿真图低电平的时间占3/4,高电平的时间占1/4,是反的呢?
不是应该占空比3/4吗?

1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2018-11-22
在线时间
14 小时
发表于 2020-4-25 10:57:08 | 显示全部楼层
没有反,TIM_Prescaler 决定的计数频率,TIM_Period是重装载值,TIM_Pulse是调节占空比的,取值在TIM_Period范围内,你在while中把他设置为重装载值得1/4了,所以高电平就是1/4,TIM_OCPolarity  值你设置得是高极性,你设置为低得话就是低电平占1/4了,把tim配置函数每一句都理解了,每一句都有自己你的作用,库手册里写的明明白白的,不要只复制粘贴配置函数,不管作用
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-9
在线时间
6 小时
 楼主| 发表于 2020-4-25 11:10:20 | 显示全部楼层
a喜仔追梦人 发表于 2020-4-25 10:57
没有反,TIM_Prescaler 决定的计数频率,TIM_Period是重装载值,TIM_Pulse是调节占空比的,取值在TIM_Perio ...

我把CCR设置为1/4ARR=9000的,PWM2模式,当CNT>CCR时高电平有效,所以当CNT<CCR时应该是低电平,而CNT>CCR时应该是高电平啊,那不是应该<9000时是低电平,9000~36000应该是高电平吗?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-9
在线时间
6 小时
 楼主| 发表于 2020-4-25 11:13:53 | 显示全部楼层
a喜仔追梦人 发表于 2020-4-25 10:57
没有反,TIM_Prescaler 决定的计数频率,TIM_Period是重装载值,TIM_Pulse是调节占空比的,取值在TIM_Perio ...

while中是设置 比较寄存器的值,不是重装载值

void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4)
{
  /* Check the parameters */
  assert_param(IS_TIM_LIST3_PERIPH(TIMx));
  /* Set the Capture Compare4 Register value */
  TIMx->CCR4 = Compare4;
}
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-9
在线时间
6 小时
 楼主| 发表于 2020-4-25 11:50:44 | 显示全部楼层
a喜仔追梦人 发表于 2020-4-25 10:57
没有反,TIM_Prescaler 决定的计数频率,TIM_Period是重装载值,TIM_Pulse是调节占空比的,取值在TIM_Perio ...

你的解释里并没有提到选择的PWM模式,难道不管选择哪种模式,只要设置占空比TIM_Pulse和极性TIM_OCPolarity就输出了吗?
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-6-9
在线时间
6 小时
 楼主| 发表于 2020-4-27 00:16:31 | 显示全部楼层
请问哪位大神能给我解答啊?想不明白啊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 10:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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