赞
踩
接线图项目结构
PWM.C
#include "stm32f10x.h" // Device header void PWM_Init(void){ // 开启时钟,这里TIM2是通用寄存器 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); // GPIO初始化代码 /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; // 使用复用开漏推挽输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出 // 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟 TIM_InternalClockConfig(TIM2); // 配置时基单元,初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; // 将结构体成员都引用出来放置在这个位置 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 配置参数是否分屏 TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; // 选择计数的模式选择向上计数 TIM_TimeBaseInitStructure.TIM_Period = 100 -1; // 表示ARR自动重装器的值,这两个参数的取值都要在0-65535之间 TIM_TimeBaseInitStructure.TIM_Prescaler = 36-1; // PSC预分频器的值 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器的值 // 初始化结构体并将结构体的地址放置在init函数中 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // 初始化输出比较单元 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 ; //设置CCR,设置ccr寄存器的值 TIM_OCInitStructure.TIM_Pulse = 0; // CCR TIM_OC3Init(TIM2, &TIM_OCInitStructure); // 启动定时器 TIM_Cmd(TIM2, ENABLE); } void PWM_SetCompare3(uint16_t Compare){ TIM_SetCompare3(TIM2,Compare); }
PWM.h
电机驱动函数Motor.c
`#include "stm32f10x.h" // Device header #include "PWM.h" void Motor_Init(void){ /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 初始化电机方向控制角度 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA1和PA2引脚初始化为推挽输出 PWM_Init(); } // 设置直流电机速度的函数 void Motor_SetSpeed(int8_t Speed){ // 判断电机是正转还是反转 if(Speed >= 0){ // 控制方向角度 GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); // 控制直流电机的速度 PWM_SetCompare3(Speed); }else{ // 控制电机反转 GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_4); // 控制直流电机的速度 PWM_SetCompare3(-Speed); } }`
电机驱动函数Motor.h
main函数文件
`#include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Motor.h" #include "Key.h" uint8_t KeyNum; //定义用于接收按键键码的变量 int8_t Speed; //定义速度变量 int main(void) { /*模块初始化*/ OLED_Init(); //OLED初始化 Motor_Init(); //直流电机初始化 Key_Init(); //按键初始化 /*显示静态字符串*/ OLED_ShowString(1, 1, "Speed:"); //1行1列显示字符串Speed: while (1) { KeyNum = Key_GetNum(); //获取按键键码 if (KeyNum == 1) //按键1按下 { Speed += 20; //速度变量自增20 if (Speed > 100) //速度变量超过100后 { Speed = -100; //速度变量变为-100 //此操作会让电机旋转方向突然改变,可能会因供电不足而导致单片机复位 //若出现了此现象,则应避免使用这样的操作 } } Motor_SetSpeed(Speed); //设置直流电机的速度为速度变量 OLED_ShowSignedNum(1, 7, Speed, 3); //OLED显示速度变量 } } `
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。