解释if(Motor_stop==1)//停止 { TIM_SetCompare1(TIM2,00); TIM_SetCompare2(TIM2,00);
时间: 2023-12-07 10:17:34 浏览: 93
这段代码是用来控制电机停止的。如果 `Motor_stop` 的值为1,就执行花括号内的代码。其中,`TIM_SetCompare1(TIM2,00)` 和 `TIM_SetCompare2(TIM2,00)` 分别用来控制电机的两个引脚(可能是 PWM 输出引脚)的占空比,将其设置为0,相当于断开电机的电源,使电机停止运行。
相关问题
float speed; int main(void) { Breath_Init (); KEY_InitU(); OLED_Init(); Motor_init(); OLED_ShowString(1,1,"Rspeed:"); while (1) { Motor_derection(20); } } #include "stm32f10x.h" // Device header void Breath_Init () { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); GPIO_InitTypeDef GPIO_Initstucture; GPIO_Initstucture.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽 GPIO_Initstucture.GPIO_Pin=GPIO_Pin_0; GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstucture); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstucture; TIM_TimeBaseInitstucture.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitstucture.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitstucture.TIM_Period=100-1;//72M/TIM_Period为频率也是ARR TIM_TimeBaseInitstucture.TIM_Prescaler=72-1;//分频也是PSC TIM_TimeBaseInitstucture.TIM_RepetitionCounter=0;//周期数 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstucture); TIM_OCInitTypeDef TIM_OCInitstructure; TIM_OCStructInit(&TIM_OCInitstructure); TIM_OCInitstructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitstructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitstructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitstructure.TIM_Pulse=0;//CCR TIM_OC1Init(TIM2,&TIM_OCInitstructure); TIM_Cmd(TIM2,ENABLE); } void TIM_Compare(uint16_t compare) { TIM_SetCompare1(TIM2,compare); } void KEY_InitD (void)//下拉 { //GPIOB初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode =GPIO_Mode_IPD ; GPIO_Initstructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); } void KEY_InitU (void)//上拉 { //GPIOB初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Mode =GPIO_Mode_IPU ; GPIO_Initstructure.GPIO_Pin = GPIO_Pin_1; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_Initstructure); } uint16_t Key_GetNum () { uint8_t KeyNum = 0; if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0) { Delay_ms(20); while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0); Delay_ms(20); KeyNum = 1; } } void Motor_init () { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; GPIO_Init(GPIOA, &GPIO_InitStructure); } void Motor_derection (float speed) { if(speed>0) { GPIO_SetBits(GPIOA,GPIO_Pin_4);//in1 GPIO_ResetBits(GPIOA,GPIO_Pin_5);//in2 TIM_Compare(speed); } else GPIO_ResetBits(GPIOA,GPIO_Pin_4);//in1 GPIO_SetBits(GPIOA,GPIO_Pin_5);//in2 TIM_Compare(-speed); } 为什么直流电机不转
根据给出的代码,直流电机不转的可能原因有以下几点:
1. 未正确初始化引脚:在`Motor_init()`函数中,需要将GPIOA的引脚4和5初始化为输入上拉模式。但是,在给出的代码中,并没有调用`Motor_init()`函数进行引脚的初始化。因此,需要在`main()`函数中添加`Motor_init()`函数的调用。
2. 未设置合适的方向和速度:在`Motor_derection()`函数中,根据`speed`的正负来设置电机的方向以及使用`TIM_Compare()`函数设置PWM的占空比。需要确保`speed`的值是正确设置且适合驱动电机的范围。
3. 未启动定时器:在`Breath_Init()`函数中,需要使用`TIM_Cmd(TIM2,ENABLE);`启动定时器2。但是,在给出的代码中,并没有调用该函数来启动定时器。因此,需要在`main()`函数中添加该函数的调用。
如果以上问题都已解决,并且硬件连接正确,但直流电机仍然不转动,则可能是其他硬件或电路问题。需要仔细检查硬件连接、电源供应等方面的问题。
while(1) { if(USART_RX_STA&0x8000)//接受到任意数据即对LED1取反,并在端口显示 { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("您发送的消息为: "); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } switch(USART_RX_BUF[0]) { case 'OF':LED1=1;printf("您发送的消息为:1");break; case '2':LED2=1;printf("您发送的消息为:2");break; case 'CF':LED1=0;printf("您发送的消息为:3");break; case '4':LED2=0;break; case '5':LED1=0;LED2=0;break; case '6':LED1=1;LED2=1;break; case '7': arr=1000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=300; TIM_SetCompare2(TIM2,ccr); flag=0; break; case '8' : arr=2000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=1400; TIM_SetCompare2(TIM2,ccr); flag=0; break; case '9': arr=3000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=3000; TIM_SetCompare2(TIM2,ccr); flag=0; break; } } for(flag=0;flag<500;flag){ if(flag<250) { u8DispBuf[1]=0; u8DispBuf[2]=0; u8DispBuf[3]=0; u8DispBuf[4]=arr/1000;//周期显示 } else { u8DispBuf[1]=0; u8DispBuf[2]=0; u8DispBuf[3]=(ccr*100/arr)/10; u8DispBuf[4]=(ccr*100/arr) %10; //高电平时间显示 } DispUpdate(); flag++; } }为什么Switch语句中的代码无法正常执行
根据代码的结构和注释,这段代码是一个死循环,主要是通过串口接收数据并进行处理。在 Switch 语句中,根据接收到的数据进行不同的操作,包括控制 LED 灯的亮灭和定时器的设置。
但是,从代码中并没有看到与定时器相关的初始化和开启操作。在 Switch 语句中,设置了不同的定时器参数,但是没有对定时器进行初始化和开启,因此无法正常执行。
另外,代码中的 for 循环中有一个错误,flag 变量没有进行自增操作,导致该循环会一直卡在里面,阻塞程序的正常执行。
阅读全文