中级会员
- 积分
- 357
- 金钱
- 357
- 注册时间
- 2020-1-6
- 在线时间
- 92 小时
|
楼主 |
发表于 2020-8-18 15:52:14
|
显示全部楼层
本帖最后由 fcm32 于 2020-8-18 16:01 编辑
有感按键调速源代码,Mini STM32开发板上的WK_UP键 控制电机的启动和停止,KEY1键控制加速,KEY0键控制减速, PC13接地改变电机转向 main.c
/************************************************************************
* File Name : main.c
* Author : MCD Application Team
* Version : V3.5.0
* Date : 18-August-2020
* Description : Main program body
************************************************************************/
/*包含头文件*/
#include"stm32f10x.h"
#include"stdbool.h"
void SysTick_Init(u8 SYSCLK);//SysTick初始化函数声明
void delay_ms(u16 nms); //自定义的延时毫秒函数声明
u8 fac_us=0;
u16 fac_ms=0;
u16 motor_statue=0;
u16 startcnt=0;
extern u16 My_PWM; //pwm值
extern u16 Hall,time; //霍尔,计时时间
extern bool Direction; //电机旋转方向
extern int aim_speed; // PWM占空比
/* Private function prototypes 自定义函数声明*/
void GPIO_Configuration(void); //GPIO端口初始化函数声明
void NVIC_Configuration(void); //中断初始化函数声明
extern void TIM1_Configuration1(void);//TIM1初始化函数声明
extern void TIM2_Configuration1(void);//TIM2初始化函数声明
extern void Hall_SW(void); //六步换向函数声明
u8 key_con(void); //扫描按键函数声明
/*******************************************************************************
main主函数
*******************************************************************************/
int main(void)
{ int i;
u8 keytemp=0;
bool flag=0;
SysTick_Init(72); // 调用SysTick初始化函数
NVIC_Configuration(); //调用中断配置函数
TIM1_Configuration1(); //调用TIM1配置函数
TIM2_Configuration1(); //调用TIM2配置函数
GPIO_Configuration(); //调用GPIO端口配置函数
aim_speed=1000; //PWM捕获比较寄存器值,决定占空比
Hall=1;
while (1)
{
keytemp= key_con(); //按键读取
if(keytemp==1) //启动
{
flag=!flag; //WK_UP一键启动停止
if(flag==1)
{TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
startcnt=0;}
else {TIM_Cmd(TIM1, DISABLE);
TIM_CtrlPWMOutputs(TIM1, DISABLE);}
}
if(keytemp==2) //停止
{
TIM_Cmd(TIM1, DISABLE);
TIM_CtrlPWMOutputs(TIM1, DISABLE);
}
if(keytemp==3) //速度加
{
if(time >100)
{
if(aim_speed <5000)
aim_speed+=10;
time =0;
}
}
else if(keytemp==4) //速度减
{
if(time>100)
{
if(aim_speed >200 )
aim_speed-=10;
time=0;
}
}
if(startcnt<36) //换相6次后启动
{
if(time>10)
{
Hall_SW();
Hall++;
if( Hall>6)
Hall=1;
time=0;
}
startcnt++;
}
else
{
startcnt=37;
for(i=0;i<100000;i++);
My_PWM = aim_speed;
}
}
}
void SysTick_Init(u8 SYSCLK) //SysTick初始化函数
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数
fac_ms=(u16)fac_us*1000; //1ms 需要计数的次数
}
void delay_ms(u16 nms) //利用SysTick自定义的延时毫秒函数
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // nms毫秒需要装载的寄存器值 最大1864ms
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~0x01; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
/*******************************************************************************
扫描按键,读取按键参数的函数
*******************************************************************************/
u8 key_con(void)
{ static u8 key;
key=0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))//如果按下WK_UP键,返回键值1 启停电机
{ delay_ms(10); //延时去抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0))
{while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1);//等待WK_UP键松开
key=1;}
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0))//如果PC0接地,返回键值2 电机停转
{ key=2;
}
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15))//如果按下KEY1键,返回键值3 电机加速
{ key=3;
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_5))//如果按下KEY0键,返回键值4 电机减速
{ key=4;
}
if(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13))//如果PC13接地电机反转
{ Direction=1;
}
else Direction=0;
return key;
}
/*******************************************************************************
GPIO端口初始化函数
*******************************************************************************/
void GPIO_Configuration(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
/*配置5个按键端口*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD ,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//IO口上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//IO口下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置wk_up键控制电机启停
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//IO口上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //配置KEY1加速按键
/* 配置Hall接口IO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*霍尔信号线外部中断配置*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);//设置PB6与EXTI6中断线连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource7);//设置PB7与EXTI7中断线连接
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);//设置PB8与EXTI8中断线连接
EXTI_InitStructure.EXTI_Line = EXTI_Line6|EXTI_Line7|EXTI_Line8;//待配置的中断线标号为6,7,8
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//上升沿和下降沿响应中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线EXTI_Line6~8
EXTI_Init(&EXTI_InitStructure);
/*PA8,PA9,PA10为上半桥臂端口配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*PB13,PB14,PB15 为下半桥臂端口配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*******************************************************************************
NVIC中断管理配置初始化函数
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置中断优先级分组值为1,即1位抢占式3位响应式
/*初始化霍尔中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;//设置中断通道为EXTI9_5 (霍尔)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3; //响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能IRQ通道
NVIC_Init(&NVIC_InitStructure);
/*初始化TIM2中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //TIM2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //响应优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能TIM2中断
NVIC_Init(&NVIC_InitStructure);
}
|
|