新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2018-2-9
- 在线时间
- 7 小时
|
13金钱
本帖最后由 爱兜风ADF 于 2018-2-10 10:44 编辑
看完原子哥的按键扫描程序后,就拿按键扫描的思路做了一个控制电机的程序:
#include "BEEP.h"
#include "stm32f10x.h"
#include "delay.h"
#include "KEY.h"
#include "led.h"
int main()
{
vu8 key;
LED_Init();
delay_init();
KEY_init();
while(1)
{
key=KEY_scan(0);
switch(key)
{
case 0:
{
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_us(1500);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_us(18500);
}break;
case 1:
{
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_ms(4);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_ms(16);
}break;
case 2:
{
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_ms(2);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_ms(18);
}break;
default:
delay_ms(10);
}
}
}
其中,0,1,2对应的是板子上的三个键。烧进去以后,电机运转良好。按0可以正转30度左右,按1或2可以再转回来。
看完中断函数后,希望用中断函数使串口接到数据后,产生接收中断,电机一次性转30度再转回来,所以写了以下代码
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
void USART1_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
USART_InitStruct.USART_BaudRate=115200;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits=USART_StopBits_1;
USART_InitStruct.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStruct);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
}
void USART1_IRQHandler()
{
u16 t;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
t=USART_ReceiveData(USART1);
USART_SendData(USART1,t);
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_us(1500);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_us(18500);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_ms(5000);
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_ms(4);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_ms(16);
}
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART1_Init();
Motor_Init();
delay_init();
while(1);
}
(由于mdk代码复制中文部分会乱码,所以代码没注释,见谅。)然而问题出现了,按照我的设想,电机应该正着转过去等5s再转回来,结果当串口发送一个数字后,他会朝一个方向断断续续地转3下。。。。由于还没学到PWM波实验那,我就通过将PF11置0或1来控制舵机,难道不能这么玩?我产生的是假的PWM波?
将电机的正转或者反转的那部分单独运行(比如下面这段),其他的注释掉,电机转的角度似乎也没有在按键实验里的那么大。
GPIO_SetBits(GPIOF,GPIO_Pin_11);
delay_us(1500);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
delay_us(18500);
GPIO_ResetBits(GPIOF,GPIO_Pin_11);
求大神告知我哪里出问题了。。。万分感激。。。 编辑一下 工程文件在7楼
|
|