OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 26242|回复: 113

开源BLDC无刷驱动开发板电路原理图+源代码

  [复制链接]

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
发表于 2020-7-5 15:33:01 | 显示全部楼层 |阅读模式
本帖最后由 fcm32 于 2020-10-27 20:22 编辑

手里有个正点原子MiniSTM32开发板,点了灯就一放着吃灰中,现在直流无刷很热门流行,于是想着怎么把它搞成无刷驱动板. MiniSTM32开发板上STM32的IO都用排针引出来,正好可以利用这些IO,四个按键可以控制电机启停,加减速, 准备外接搭一块MOS功率板,外接PCB板上准备放置MOS,MOS预驱动,BUCK电源,霍尔接口,运放比较器,无感反电势采集等电路. 有感 无感 FOC让它都可以跑起来

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-12-10 20:39:54 | 显示全部楼层
资料开源了,可以直接下载
回复 支持 2 反对 0

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-5 15:50:14 | 显示全部楼层
本帖最后由 fcm32 于 2020-7-9 13:43 编辑

先开始画PCB板,为方便焊接.贴片用0805封装。
202007.png


回复 支持 反对

使用道具 举报

2

主题

172

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3141
金钱
3141
注册时间
2014-11-29
在线时间
183 小时
发表于 2020-7-6 08:28:47 | 显示全部楼层
支持…………………………
lutigers
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-7 11:58:00 | 显示全部楼层
眼看它一团乱麻!
回复 支持 反对

使用道具 举报

2

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2019-9-5
在线时间
27 小时
发表于 2020-7-7 15:04:10 | 显示全部楼层
1、功率管不用堆在一起
2、板子没有安装孔位
3、浪费板子面积,面积裁掉一半都可以的,有些电阻放到另一面去
4、注意电阻电容方向,尽量一顺,不要横竖都有
5、强弱信号接口分两边,排整齐
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-7 19:01:35 | 显示全部楼层
flashman8 发表于 2020-7-7 15:04
1、功率管不用堆在一起
2、板子没有安装孔位
3、浪费板子面积,面积裁掉一半都可以的,有些电阻放到另一 ...

谢谢.                                    
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-9 13:48:48 | 显示全部楼层
板子终于布完工了.
20200709134552.png


回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-10 10:41:49 | 显示全部楼层
由于要和Mini STM32开发板连接,驱动板上加了四个95*75的螺丝孔,与STM32连接的信号线用彩排线连接,驱动板上预留了排针, 这样可以和其它各种STM32开发板连接.
回复 支持 反对

使用道具 举报

21

主题

217

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2121
金钱
2121
注册时间
2017-12-11
在线时间
459 小时
发表于 2020-7-10 10:51:05 | 显示全部楼层
顶!持续关注中!
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-11 08:24:24 | 显示全部楼层
PCB已出去打样中了
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-11 08:25:20 | 显示全部楼层
PCB已经在打样了.
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-14 08:16:00 | 显示全部楼层
本帖最后由 fcm32 于 2020-7-14 11:52 编辑

PCB终于到了
20200714PCB.png
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-16 18:55:45 | 显示全部楼层
先焊接了BUCK电源,+3.3v给原子开发板供电 20200716.png
回复 支持 反对

使用道具 举报

2

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2014-9-5
在线时间
179 小时
发表于 2020-7-23 15:39:30 | 显示全部楼层
先顶一下关注
回复 支持 反对

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2020-7-24 08:59:30 | 显示全部楼层
围观楼主更新。
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-24 19:07:34 | 显示全部楼层
本帖最后由 fcm32 于 2020-7-24 19:09 编辑

最近白天比较忙,只能晚上焊接.
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-7-25 19:12:39 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-22 20:34 编辑

驱动无刷电机终于成功了.

20200725.png
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-1 19:00:58 | 显示全部楼层
接下来,把驱动板的原理图分析一下
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-17 08:13:42 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-17 11:56 编辑

原理图H桥部份
阿里旺旺图片20200817081228.png 20200817115233v.png 片20200817115511w.png
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-17 11:59:28 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-17 12:03 编辑

电源部分
阿里旺旺图片20200816092301.png
3.3V给Mini STM32开发板供电

回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-17 18:29:36 | 显示全部楼层
霍尔传感电路
20200817.png

回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2020-7-20
在线时间
38 小时
发表于 2020-8-17 22:56:32 来自手机 | 显示全部楼层
源程序有嘛,大佬求分享
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2020-7-20
在线时间
38 小时
发表于 2020-8-17 22:58:02 来自手机 | 显示全部楼层
源程序有嘛,大佬求分享
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-18 15:43:34 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-18 16:00 编辑

源代码有的哈,基于STM32 V3.5标准库的, 带全中文注释
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
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);                  
}



回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-18 17:27:10 | 显示全部楼层
定时器TIM1初始化      TIM1.C
#include "stm32f10x.h"
#define CKTIM        ((u32)72000000uL) //系统主频宏定义 72MHz
#define PWM_PRSC ((u8)0)//预分频值宏定义
#define PWM_FREQ ((u16) 14400) // 计数模式中央对齐时PWM为14.4KHz                        
#define PWM_PERIOD ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1)))) //自动重载值宏定义
#define REP_RATE (0)          //重复计数器寄存值宏定义

void TIM1_Configuration1(void)
{ TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure;
  TIM_OCInitTypeDef TIM1_OCInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//TIM1时钟使能
  TIM_DeInit(TIM1);                                   //复位TIM1定时器

  /*TIM1初始化配置*/
  TIM1_TimeBaseStructure.TIM_Period=PWM_PERIOD;//设置自动重载寄存器值为2500
        TIM1_TimeBaseStructure.TIM_Prescaler=0x0;   //设置预分频为0,不分频
  TIM1_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV2;//设置时钟分割
        TIM1_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方向向上计数
  TIM1_TimeBaseStructure.TIM_RepetitionCounter=REP_RATE;//设置重复计数器寄存值为0
  TIM_TimeBaseInit(TIM1, &TIM1_TimeBaseStructure);//根据上面指定参数对TIM1初始化配置

  TIM_OCStructInit(&TIM1_OCInitStructure);//把TIM定时器输出通道初始化为默认值,互补通道是关闭的
        /*TIM1的通道1,2,3的PWM模式初始化配置*/
        TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出为PWM调制模式1
  TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能                  
  TIM1_OCInitStructure.TIM_Pulse = 0x505; //设置捕获比较寄存器值1285
  TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM输出比较极性高      
  TIM_OC1Init(TIM1, &TIM1_OCInitStructure); //初始化TIM1_CH1
  TIM_OC2Init(TIM1, &TIM1_OCInitStructure); //初始化TIM1_CH2
  TIM_OC3Init(TIM1, &TIM1_OCInitStructure); //初始化TIM1_CH3
        
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM1_CH1预装载使能
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM1_CH2预装载使能
  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM1_CH3预装载使能

  /* 使能启动TIM1定时器*/
        TIM_ARRPreloadConfig(TIM1, ENABLE);//使能TIM1在ARR上的预装载寄存器
        TIM_CtrlPWMOutputs(TIM1, DISABLE); //关闭TIM1的PWM输出
  TIM_Cmd(TIM1, DISABLE);            //开启TIM1定时器
}



回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-18 17:30:20 | 显示全部楼层
定时器TIM2初始化      TIM2.C
#include "stm32f10x.h"
void TIM2_Configuration1(void)
{ TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//TIM2时钟使能
        TIM_DeInit( TIM2);//复位TIM2定时器

/* TIM2初始化配置*/
  TIM_TimeBaseStructure.TIM_Period=9; //设置自动装载寄存器值为9      
  TIM_TimeBaseStructure.TIM_Prescaler=3599;// 72M/(3599+1)/10=2KHz,以2K的频率产生中断      
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 时钟分割  
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数方向向上计数
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM2待处理标志位
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//使能TIM2更新中断  
  TIM_Cmd(TIM2, ENABLE);//使能启动TIM2定时器
}

回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-18 20:04:41 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-18 20:07 编辑

中断函数  stm32f10x_it.c  
/******************************************************************************
  * File Name   : stm32f10x_it.c
  * Author      : MCD Application Team
  * Version     : V3.5.0
  * Date        : 18-August-2020
  * @brief   Main Interrupt Service Routines.主中断服务程序                  
  ******************************************************************************/
/*Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
#include "stdbool.h"
bool Direction;
u16 Hall;
u16 time=0;
extern u16 motor_statue;
u16 My_PWM=1000;
int aim_speed;

/******************************************************************************/
/*            Cortex-M3 Processor Exceptions Handlers                         */
/******************************************************************************/
void Hall_SW(void) //六步换向函数
{ motor_statue=1;
        switch(Hall)
        { case 5:     
                /* Next step: Step 2 Configuration --------i-------------------- */
                /* Channel3 configuration */
              TIM1->CCR2=0;             //AB  电机UV线通
                   TIM1->CCR1 = My_PWM;                                          
       TIM1->CCR3=0;
                   GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15);
                   GPIO_SetBits(GPIOB, GPIO_Pin_14);   
      break;
               
          case 1:
                /* Next step: Step 3 Configuration ---------------------------- */
            /* Channel2 configuration */
                   TIM1->CCR2=0;              //AC  电机UW线通
                   TIM1->CCR1 = My_PWM;                                          
       TIM1->CCR3=0;
       GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14);
                   GPIO_SetBits(GPIOB, GPIO_Pin_15);  
                   break;
               
                case 3:
                /* Next step: Step 4 Configuration ---------------------------- */
                        TIM1->CCR1=0;          //BC     电机VW线通
                  TIM1->CCR2 = My_PWM;                                          
      TIM1->CCR3=0;
            GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14);
                  GPIO_SetBits(GPIOB, GPIO_Pin_15);     
           break;

                case 2:
                /* Next step: Step 5 Configuration ---------------------------- */
             TIM1->CCR1=0;        //BA        电机VU线通
                   TIM1->CCR2 = My_PWM;                                          
       TIM1->CCR3=0;
             GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15);
                   GPIO_SetBits(GPIOB, GPIO_Pin_13);
       break;

                case 6:
                /* Next step: Step 6 Configuration ---------------------------- */
                        TIM1->CCR2=0;//CA                电机WU线通  
            TIM1->CCR3 = My_PWM;                                          
      TIM1->CCR1=0;
      GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15);
                  GPIO_SetBits(GPIOB, GPIO_Pin_13);   
            break;

                case 4:
                /* Next step: Step 1 Configuration ---------------------------- */
                        TIM1->CCR2=0; //CB                电机WV线通     
                  TIM1->CCR3 = My_PWM;                                          
      TIM1->CCR1=0;
      GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15);
                  GPIO_SetBits(GPIOB, GPIO_Pin_14);   
            break;
     default:
                /* Next step: Step 1 Configuration ---------------------------- */
                /* Channel1 configuration */
                break;
        }
}

void EXTI9_5_IRQHandler(void)  //引脚中断进行换向
{   
        Hall=GPIO_ReadInputData(GPIOB); //读取引脚值
        Hall=Hall&0x01c0;
        Hall=Hall>>6;  
if(!Direction)Hall=7-Hall;    //反方向处理
  Hall_SW();
        if(EXTI_GetITStatus(EXTI_Line6)!= RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line6);
        }
                if(EXTI_GetITStatus(EXTI_Line7)!= RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line7);
        }
                if(EXTI_GetITStatus(EXTI_Line8)!= RESET)
        {
                EXTI_ClearITPendingBit(EXTI_Line8);
        }
}


void TIM2_IRQHandler(void)  //TIM2中断函数
{  if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
        {
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
                   time++;
   }
}




回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-20 12:44:13 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-29 13:31 编辑

驱动板元件全部焊接完工

片20200820124028.png
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-22 20:47:36 | 显示全部楼层
本帖最后由 fcm32 于 2020-9-6 11:00 编辑

驱动板上装上四支铜柱,以便和Mini STM32开发板连接固定
20200822204433.png
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-26 10:48:47 | 显示全部楼层
本帖最后由 fcm32 于 2020-8-29 13:30 编辑

与miniSTM32板子连接好,连上相应的控制信号线
上电复位后,按MINI STM32开发板上WK_UP键启动电机,再按WK_UP电机停转,再按电机又启动运转,如此循环.  按KEY1键电机加速,KEY0键减速, PC13接地改变转向, 右侧3个一字接线柱可外接电位器无极调速.
20200826103931.png
回复 支持 反对

使用道具 举报

21

主题

217

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2121
金钱
2121
注册时间
2017-12-11
在线时间
459 小时
发表于 2020-8-26 10:55:32 | 显示全部楼层
给力,能上个电机速度、位置、电流三环控制吗?
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-26 10:59:46 | 显示全部楼层
闭环程序也有的,后面我整理一下
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-8-29 17:06:45 | 显示全部楼层
程序主要包含四个文件
一  main.c               主程序
二  stm32f10x_it.c   放六步换向函数,霍尔引脚外部中断函数,通用定时器TIM2中断函数
三  TIM1.c              高级定时器TIM1初始化配置
四  TIM2.c              通用定时器TIM2初始化配置
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-9-2 21:07:01 | 显示全部楼层

先看主程序main.c, 主程序很简单就11条语句,就最后一句一个while大循环比较复杂
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)
{......}
}
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-9-3 07:52:44 | 显示全部楼层
本帖最后由 fcm32 于 2020-9-3 12:25 编辑

主函数main()前面是一些头文件包含,变量的声明,以及在主函数main()内需要用到的被调函数的声明
/*包含头文件*/
#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值                                                                   变量或函数如果在外部c文件定义的,声明时加关键字extern
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);             //扫描按键函数声明
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-10-27 20:21:49 | 显示全部楼层
本帖最后由 fcm32 于 2020-11-6 11:25 编辑

在上个用电位器控制的调速程序
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-11-6 12:21:51 | 显示全部楼层
方波霍尔电位器调速(STM32-V3.5库).rar (3.87 MB, 下载次数: 549)
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-11-6 14:23:00 | 显示全部楼层
本帖最后由 fcm32 于 2020-11-6 14:25 编辑

打样了些PCB板子,有需要的人可以拿去学一学,元件焊好的板子也有
2020 v3.1.png
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2017-5-23
在线时间
24 小时
发表于 2020-11-7 11:15:07 | 显示全部楼层
来块板子呢
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-11-7 15:48:17 | 显示全部楼层
板子有的啊
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
478
金钱
478
注册时间
2020-10-22
在线时间
76 小时
发表于 2020-11-23 10:20:45 | 显示全部楼层
运行效果怎么样?
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2020-1-14
在线时间
13 小时
发表于 2020-11-24 10:14:37 | 显示全部楼层
FOC的呢?
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2020-11-30 16:31:31 | 显示全部楼层
remonwoo 发表于 2020-11-23 10:20
运行效果怎么样?

效果很好的
回复 支持 反对

使用道具 举报

13

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2019-3-10
在线时间
71 小时
发表于 2020-12-1 07:16:15 | 显示全部楼层
老师能给我给我一份吗,好好学习学习。谢谢
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-12-8
在线时间
6 小时
发表于 2020-12-22 23:55:07 | 显示全部楼层
大大你好,我想要學習,LAYOUT,可否提共原理圖根PCB。
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-12-8
在线时间
6 小时
发表于 2020-12-23 22:50:15 | 显示全部楼层
請問 我沒有JLINK,有其他方法燒入嗎, PA8,PA9,PA10為上半橋臂端口配置。 USB燒錄 使用 PA9   PA10
回复 支持 反对

使用道具 举报

5

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2015-8-10
在线时间
49 小时
发表于 2020-12-27 10:14:34 | 显示全部楼层
资源观测测试
回复 支持 反对

使用道具 举报

2

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2020-1-6
在线时间
92 小时
 楼主| 发表于 2021-1-7 14:29:49 | 显示全部楼层
烧录程序可以用ST-LINK
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 05:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表