OpenEdv-开源电子网

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

新手请教pwm例程以外的io口发射pwm波控制舵机

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2022-1-2
在线时间
8 小时
发表于 2022-4-9 23:12:29 | 显示全部楼层 |阅读模式
1金钱

最佳答案

查看完整内容[请看2#楼]

没听说过PWM有限制 我用过072系列的TIM2 CH2 3 4同时产生PWM来控制一个红绿蓝三色LED 可以正常控制 不过我看PB4的main function是JNTRST 是不是JTAG相关的东西产生影响了呢 还有TIM3 CH1的默认口时PA6 你为啥不用这个口非要重映射呢
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-4-9 23:12:30 | 显示全部楼层
没听说过PWM有限制 我用过072系列的TIM2 CH2 3 4同时产生PWM来控制一个红绿蓝三色LED 可以正常控制

不过我看PB4的main function是JNTRST 是不是JTAG相关的东西产生影响了呢
还有TIM3 CH1的默认口时PA6 你为啥不用这个口非要重映射呢
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2022-1-2
在线时间
8 小时
 楼主| 发表于 2022-4-11 10:03:38 | 显示全部楼层
帮自己顶一下
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2022-1-2
在线时间
8 小时
 楼主| 发表于 2022-4-11 10:09:07 | 显示全部楼层
如题目,手上的板子是stm32f103rct6(mini),手册上时钟与针脚对应如下图,
tim3ch2部分重映射输出通道为pb5,tim3ch1部分重映射输出通道为pb4,
原子哥的b站教学第33讲:

【正点原子】 手把手教你学STM32单片机教学视频 嵌入式 之 F103-基于新战舰V3/精英/MINI板_哔哩哔哩_bilibili


用的 定时器_通道 是tim3_ch2,在我的板子上它输出在pb5,我按部就班地做实验果然pb5可以。但是当我想更改成tim3_ch1输出在pb4的时候就不行了,检查了很多遍都没发现问题在哪儿。。。
以下为pwm.c初始化文件:

#include "pwm.h"
#include "sys.h"
void TIM3_PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef TIM_InitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_InitStructure);
//①配置gpio        
        
        TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_InitStruct.TIM_Period=arr;
        TIM_InitStruct.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM3,&TIM_InitStruct);
//②配置定时器        
        
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
//②重映射
        
        TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;
        TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC1Init(TIM3,&TIM_OCInitStruct);
//③配置输出通道        
        TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
//④使能预装载寄存器        
        TIM_Cmd(TIM3,ENABLE);
//⑤使能该定时器        
}


打算用key1与key0两个按键控制舵机的左右转动,在main函数为:

int main(void)
{
         u8 t=0;
         u8 angle=90;
         u16 ccr=0;
         LED_Init();
         KEY_Init();
         delay_init();
         TIM3_PWM_Init(999,287);
         
         while(1)
         {
                 t=KEY_Scan(1);
                 if(angle<=180&&angle>0)
                 {
                         switch(t)
                         {
                                 case KEY1_PRES:
                                         angle=angle+1;
                                   GPIO_SetBits(GPIOA,GPIO_Pin_6);//提示灯
                                   GPIO_ResetBits(GPIOA,GPIO_Pin_5);//提示灯
                                 delay_ms(11);
                                 break;
                                 
                                 case KEY0_PRES:
                                         angle=angle-1;
                                   GPIO_SetBits(GPIOA,GPIO_Pin_5);//提示灯
                                   GPIO_ResetBits(GPIOA,GPIO_Pin_6);//提示灯
                                 delay_ms(11);
                                 break;

                                 case WKUP_PRES:
                                         angle=90;
                                 delay_ms(11);
                                 default:
                                         delay_us(40);
                         }
                          ccr=(u16)391+angle*8/3;
                                TIM_SetCompare1(TIM3,ccr);//角度转换为ccr后输出到舵机
                 }         else if(angle>180)angle=180;
                 else if(angle<=0)angle=1;
         }
}

               
这串代码当我把输出改成tim3_ch2部分重映射到pb5输出的时候就可以达成目的,但是改成tim3_ch1以及任何其它在手册里看到的定时器通道均不行!!舵机在接上其他通道的时候绵软无力(但指示灯正常运作),说明根本没有收到输出        
之前浏览手册,好像说许多定时器仅能在ch1与ch2两个通道输出pwm波?
求助!想知道stm32的pwm波输出io口到底有什么禁忌???哪些io口或者哪些定时器的通道是不能输出的?为什么我上面这个不能输出?

回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2022-1-2
在线时间
8 小时
 楼主| 发表于 2022-4-11 13:26:50 | 显示全部楼层
babyrabbit 发表于 2022-4-11 11:00
没听说过PWM有限制 我用过072系列的TIM2 CH2 3 4同时产生PWM来控制一个红绿蓝三色LED 可以正常控制

不过 ...

玩呗233333故意乱选了一个定时器引脚来控制舵机
那可能就是pb4的问题了,我刚刚试了试好像确实除了它其他的引脚都可以
多谢帮忙~
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4734
金钱
4734
注册时间
2015-1-10
在线时间
591 小时
发表于 2022-4-11 13:36:48 | 显示全部楼层
硬件上PB4有没有接其他外设,要是外部来个上拉的话在GPIO上是看不到PWM的
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2022-4-11 16:40:28 | 显示全部楼层
对照原理图看下,配置这个来看没看出来有什么问题,可能是硬件上有什么影响到了io的状态
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 14:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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