OpenEdv-开源电子网

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

STM32F4 PWM脉冲个数控制台达伺服电机

[复制链接]

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
发表于 2021-8-19 11:07:39 | 显示全部楼层 |阅读模式
10金钱
兄弟萌,我最近在做STM32F429控制台达的伺服电机驱动器。我这边用的主从定时器,一个负责输出PWM脉冲,一个负责计数。定时器频率较低的时候,脉冲个数还比较准确。但是频率一高(100K),就会出现脉冲丢失的问题。我发10000个脉冲就会丢失200-300个。但是台达的伺服电机驱动器的频率又是100K,每次脉冲输出都会丢失,而且丢失的个数也不固定。请问兄弟萌有没有整过。
void Tim3_Config_init(uint16_t TIM3_Prescaler, uint16_t TIM3_Period, uint16_t CCR_C)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

    GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM3);

    TIM_DeInit(TIM3);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOC, &GPIO_InitStructure);  

    TIM_TimeBaseStructure.TIM_Prescaler=TIM3_Prescaler-1;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period=TIM3_Period-1;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_Low;
    TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;       
    TIM_OCInitStructure.TIM_Pulse = CCR_C ;

    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);       
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);

    TIM_SelectMasterSlaveMode( TIM3, TIM_MasterSlaveMode_Enable);
        TIM_SelectOutputTrigger( TIM3, TIM_TRGOSource_Update);

    TIM_ARRPreloadConfig(TIM3, ENABLE);  
}


void Tim5_Config(u16 PulseNum_C)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

    TIM_TimeBaseStructure.TIM_Prescaler=0;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseStructure.TIM_Period=PulseNum_C;
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);

    TIM_SelectInputTrigger(TIM5, TIM_TS_ITR1);
    TIM_SelectSlaveMode(TIM5,TIM_SlaveMode_External1);

    TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);

    NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;        
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    TIM_ITConfig(TIM5,TIM_IT_Update,DISABLE);
}


void Pulse_output_3(u32 Cycle_C,u16 PulseNum)
{
    Tim5_Config(PulseNum);
    TIM_Cmd(TIM5, ENABLE);
    TIM_ClearITPendingBit(TIM5,TIM_IT_Update);
    TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
    Tim3_Config_init(840, Cycle_C, Cycle_C / 2);  
    TIM_Cmd(TIM3, ENABLE);
}
void TIM5_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)   
    {
        TIM_ClearITPendingBit(TIM5, TIM_IT_Update);

        TIM_Cmd(TIM3, DISABLE);
        TIM_Cmd(TIM5, DISABLE);
        TIM_ITConfig(TIM5, TIM_IT_Update, DISABLE);

    }
}


主函数里面就是
Pulse_output_3(10,10000);

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

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2021-8-19 11:09:14 | 显示全部楼层
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-8-19 11:51:13 | 显示全部楼层
要控制输出个数用单脉冲的方式?帮顶!
日常敲键--头秃一片
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3359
金钱
3359
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-8-19 12:19:57 | 显示全部楼层
单脉冲很准确了,连计数也省掉了
回复

使用道具 举报

20

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2020-5-6
在线时间
43 小时
 楼主| 发表于 2021-8-19 14:02:10 | 显示全部楼层
c2007s 发表于 2021-8-19 12:19
单脉冲很准确了,连计数也省掉了

我现在一个引脚控制方向,一个引脚输出脉冲。就感觉是频率太高了,使得脉冲丢失。我代码贴全了。主函数里面的就一个pluse()调用。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 06:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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