新手上路
- 积分
- 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口或者哪些定时器的通道是不能输出的?为什么我上面这个不能输出?
|
|