OpenEdv-开源电子网

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

如何将PC7设置为高级定时器8的持续PWM输出模式?

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-12-11
在线时间
8 小时
发表于 2021-3-29 00:49:35 | 显示全部楼层 |阅读模式
5金钱
       楼主目前在做毕业设计,要用到原子的STM32F1的核心板通过TB6600控制42两相步进电机实现电机的转速可调,而且要能一直转,直到断电才停下来。可是正点原子给的官方的ATK-
2MD4850电机驱动模块的例程虽然有两种转速可调,但是由于设定是高级定时器8的单脉冲输出模式,只能给有限个脉冲,电机最终会停下来。我想通过改原子的例程来实现电机一直转动,

而不是经过固定脉冲数后,电机会停下来。


      以下是小弟我的思路,请各位大佬指正以下:

     将高级定时器8由单脉冲输出模式改为占空比可调的PWM输出模式,就类似于呼吸灯那种效果,但问题是调占空比对于电机转速和转动角度没有半毛钱影响,转动角度取决于脉冲的

个数,如下是正点原子例程中,设定电机转动角度和速度的子函数:
/********************************************
//相对定位函数
//num 0~2147483647
//frequency: 20Hz~100KHz
//dir: CW(顺时针方向)  CCW(逆时针方向)
*********************************************/
void Locate_Rle(long num,u32 frequency,DIR_Type dir) //相对定位函数
{
        if(num<=0) //数值小于等于0,则直接返回
        {
                printf("\r\nThe num should be greater than zero!!\r\n");
                return;
        }
        if(TIM8->CR1&0x01)//上一次脉冲还未发送完成,直接返回
        {
                printf("\r\nThe last time pulses is not send finished,wait please!\r\n");
                return;
        }
        if((frequency<20)||(frequency>100000))//脉冲频率不在范围内,直接返回
        {
                printf("\r\nThe frequency is out of range! please reset it!!(range:20Hz~100KHz)\r\n");
                return;
        }
        motor_dir=dir;//得到方向
        DRIVER_DIR=motor_dir;//设置方向
       
        if(motor_dir==CW)//顺时针
                target_pos=current_pos+num;//目标位置
        else if(motor_dir==CCW)//逆时针
                target_pos=current_pos-num;//目标位置
       
        rcr_integer=num/(RCR_VAL+1);//重新计数整数部分
        rcr_remainder=num%(RCR_VAL+1);//重新计数余数部分
        is_rcr_finish=0;//重复计数器未设置完成
        TIM8_Startup(frequency);//开启TIM8
}

        子函数中target_pos=current_pos+num;和target_pos=current_pos-num;中num表示电机要转动的角度,可我想让电机一直转动,有同学说可以在程序中加一个定时中断,然后每隔

一段时间就执行一次Locate_Rle(long num,u32 frequency,DIR_Type dir),但问题是,这样到了后续需要加传感器时,会产生逻辑错误,所以这个方案不行。

        然后我又想把PC7引脚设置为定时器8通道2的普通PWM输出模式,而不是单脉冲,但是我也不知道该如何修改子函数中的num,因为如果把PC7改为普通的PWM输出,相当于把void

Locate_Rle(long num,u32 frequency,DIR_Type dir) 的形参给删了,而且还要删掉target_pos=current_pos+num;//目标位置和target_pos=current_pos-num;//目标位置,请问我在例程

中,如何将PC7设置为高级定时器8的持续PWM输出模式?谢谢!


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

使用道具 举报

11

主题

2147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4894
金钱
4894
注册时间
2015-1-10
在线时间
612 小时
发表于 2021-3-29 11:27:48 | 显示全部楼层
根据datasheet上是设置不了,PC7只能重映射到TIM3_CH2
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2021-3-29 16:25:00 | 显示全部楼层
这个是TIM1的,你可以参考下http://www.openedv.com/forum.php?mod=viewthread&tid=288090
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 11:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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