OpenEdv-开源电子网

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

STM32输出可控数量的PWM

[复制链接]

14

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-7-20
在线时间
39 小时
发表于 2017-7-16 10:57:37 | 显示全部楼层 |阅读模式
本帖最后由 心语心愿 于 2017-7-16 12:11 编辑

最近控制步进电机转固定角度,在网上找很多帖子,有用DMA的,有用主从定时器的,其实STM32高级定时器就自带这样的功能,代码如下:
[mw_shl_code=c,true]void stepmotor_init()
{
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
        GPIO_InitTypeDef GPIO_Structure;
        GPIO_Structure.GPIO_Mode=GPIO_Mode_AF;
        GPIO_Structure.GPIO_OType=GPIO_OType_PP;
        GPIO_Structure.GPIO_Pin=GPIO_Pin_11;
        GPIO_Structure.GPIO_PuPd=GPIO_PuPd_DOWN;
        GPIO_Structure.GPIO_Speed=GPIO_High_Speed;
        GPIO_Init(GPIOA,&GPIO_Structure);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_TIM1);
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Down;
        TIM_TimeBaseStructure.TIM_Period=249;
        TIM_TimeBaseStructure.TIM_Prescaler=20;
        TIM_TimeBaseStructure.TIM_RepetitionCounter=4;//这里是设置PWM输出个数,PWM个数是N+1,这里写4就是5个PWM
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
        TIM_OCInitTypeDef OC_Structure;
        OC_Structure.TIM_OCMode=TIM_OCMode_PWM1;
        OC_Structure.TIM_Pulse=125;
        OC_Structure.TIM_OutputState=TIM_OutputState_Enable;
        OC_Structure.TIM_OutputNState=TIM_OutputNState_Enable;
        OC_Structure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
        OC_Structure.TIM_OCPolarity=TIM_OCPolarity_High;
        OC_Structure.TIM_OCIdleState=TIM_OCIdleState_Set;
        OC_Structure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
        TIM_OC4Init(TIM1,&OC_Structure);
        TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
        TIM_ARRPreloadConfig(TIM1,ENABLE);

        TIM_CtrlPWMOutputs(TIM1,ENABLE);
        TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//这里是设置定时器单次脉冲模式,很重要
        
        TIM_Cmd(TIM1,ENABLE);
}[/mw_shl_code]
注意一定要用高级定时器,理由如下:
[mw_shl_code=c,true]  if ((TIMx == TIM1) || (TIMx == TIM8))  
  {
    /* Set the Repetition Counter value */
    TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
  }[/mw_shl_code]
附带一张测试图片:不过这种方法也有缺点,就是最多能控制输出256个PWM

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

使用道具 举报

8

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
649
金钱
649
注册时间
2015-11-7
在线时间
192 小时
发表于 2017-7-16 14:38:12 | 显示全部楼层
发现以前一直没有打开单脉冲模式,怪不得不行,谢谢楼主分享
回复 支持 反对

使用道具 举报

14

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-7-20
在线时间
39 小时
 楼主| 发表于 2017-7-17 08:22:26 | 显示全部楼层
yklstudent 发表于 2017-7-16 14:05
谢谢楼主代码,楼主要能分享完整的控制步进电机代码就好了

我是用的TB6600步进电机驱动器,只要发送PWM就可以让电机转,这样比较方便
回复 支持 反对

使用道具 举报

8

主题

47

帖子

0

精华

高级会员

Rank: 4

积分
649
金钱
649
注册时间
2015-11-7
在线时间
192 小时
发表于 2017-7-17 11:22:09 | 显示全部楼层
请问重复计数器的更新中断可以设置吗?我没找到啊
回复 支持 反对

使用道具 举报

14

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-7-20
在线时间
39 小时
 楼主| 发表于 2017-7-17 11:58:41 | 显示全部楼层
星迹 发表于 2017-7-17 11:22
请问重复计数器的更新中断可以设置吗?我没找到啊

这个我没用到,我是用另一个定时器中断更新PWM
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-4-6
在线时间
0 小时
发表于 2018-4-6 18:21:39 | 显示全部楼层
你好,我按你说的去调试好像没有用,可以帮我看一下吗,谢谢!
[mw_shl_code=c,true]static void TIM3_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_DeInit(TIM1);   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);//Õa¸ö¿ØÖÆ

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // ¸′óÃíÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

static void TIM3_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        u16 CCR1_Val = 500;        
  /* Time base configuration */                  
  TIM_TimeBaseStructure.TIM_Prescaler = 0;            //éèÖÃÔ¤·ÖÆμ£o2»Ô¤·ÖÆμ£¬¼′Îa72MHz
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //ÏòéϼÆêyÄ£ê½
        TIM_TimeBaseStructure.TIM_Period = 999;       //μ±¶¨ê±Æ÷′ó0¼Æêyμ½999£¬¼′Îa1000′Σ¬Îaò»¸ö¶¨ê±ÖüÆú
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //éèÖÃê±Öó·ÖÆμÏμêy
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 4;       
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //ÅäÖÃÎaPWMÄ£ê½1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;           //éèÖÃìø±äÖμ£¬μ±¼ÆêyÆ÷¼Æêyμ½Õa¸öÖμê±£¬μçÆ½·¢éúìø±ä
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //μ±¶¨ê±Æ÷¼ÆêyÖμD¡óúCCR1_Valê±Îa¸ßμçÆ½
                               
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);         //ê1Äüí¨μà1
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM1, ENABLE);                         // ê1ÄüTIM3ÖØÔØ¼Ä′æÆ÷ARR
  
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single);
  TIM_Cmd(TIM1, ENABLE);
}


/**
  * @brief  TIM3 êä3&#246WMDÅoÅ3õê¼»ˉ£¬Ö»òaμ÷óÃÕa¸öoˉêy
  *         TIM3μÄËĸöí¨μà¾í»áóDPWMDÅoÅêä3ö
  * @param  ÎT
  * @retval ÎT
  */
void TIM3_PWM_Init(void)
{
        TIM3_GPIO_Config();
        TIM3_Mode_Config();               
}
int main(void)
{       
TIM3_PWM_Init();
       
        while (1)
        {

        }
}
[/mw_shl_code]
回复 支持 反对

使用道具 举报

14

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2016-7-20
在线时间
39 小时
 楼主| 发表于 2018-4-15 12:44:41 | 显示全部楼层
gy3122 发表于 2018-4-6 18:21
你好,我按你说的去调试好像没有用,可以帮我看一下吗,谢谢!
[mw_shl_code=c,true]static void TIM3_GPI ...

你是一直连续不停的产生PWM吗?还是不产生PWM
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 01:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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