找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2878|回复: 3
收起左侧

BLDC开环调速源程序

[复制链接]
ID:394338 发表于 2018-9-6 07:03 | 显示全部楼层 |阅读模式
BLDC开环调速 0.png

单片机源程序如下:
  1. /*
  2. PG6键按下时,PA4 PA5指示灯亮,
  3. PG7按下时PA4 PA5 指示灯灭。
  4. 无启停,上电开环调速,最大可设为100%,但要有一定的最少值
  5. 电机转动需要一点初始力
  6. 有感120度HALL。
  7. 开关控制采用上高下低有效电平设置
  8. 上桥 臂采用PWM功能。
  9. Designed by Cache.Lee
  10. 2013.4.2
  11. */
  12. #include "stm8s.h"   
  13. #include "OLED12864.h"
  14. #include "hall.h"

  15. #define STM8_FREQ_MHZ 16
  16. #define PWM_FREQUENCY 16000

  17. static const u16 hArrPwmVal = ((u16)((STM8_FREQ_MHZ * (u32)1000000)/PWM_FREQUENCY));
  18. //hArrPwmVal=1000

  19. #define MINPWMPERCENT 10
  20. #define MAXPWMPERCENT 100
  21. #define MINVALUE MINPWMPERCENT*10
  22. //hArrPwmVal=1000
  23. //MINPWMPERCENT*hArrPwmVal/100简化为MINPWMPERCENT*10
  24. #define MAXVALUE MAXPWMPERCENT*10
  25. //MAXPWMPERCENT*hArrPwmVal/100简化MAXPWMPERCENT*0


  26. void GPIO_int(void)//初始化按键,指示灯
  27. {
  28.         GPIOG->DDR=GPIOG->DDR&0x3f;//PG6,PG7按键配置为输入模式
  29.         GPIOG->CR1=GPIOG->CR1|0xC0;//PG6,PG7按键配置为上拉输入
  30.         GPIOA->DDR=GPIOA->DDR|0x30;//PA4,PA5指示灯配置为输出模式
  31.         GPIOA->CR1=GPIOA->CR1|0x30;//PA4,PA5指示灯d配置为推挽模式
  32.         GPIOA->ODR=0x00;//点亮指示灯
  33. }

  34. void Clock_init(void)//时钟配置 内部16M
  35. {
  36.         CLK->CKDIVR=0;
  37. }

  38. void AD_int(void)//电位器 PF5 初始化 AIN13
  39. {
  40.         u8 value;
  41.         u16 ADC_TDR_tmp;
  42.        
  43.         ADC2->CSR = 13; //AIN13通道选择       
  44.         //select 4MHz clock based on 16MHz fMaster (div4), single mode
  45.         ADC2->CR1 = 0x20;

  46.         ADC2->CR2 = 0x08;//数据右对齐
  47.         ADC2->TDRH=0x20;//AIN13 禁止施密特触发       
  48.         ADC2->CR1 |= 0X01;//使能ADC
  49.        
  50.         value=30;
  51.         while(value--); //等待ADC稳定                  

  52.         ADC2->CSR &= 0x7f;//清EOC标志
  53.         ADC2->CR1 |= 0x01;//启动AD
  54. }

  55. void PWM_IO_init(void)
  56. {        //PB012 下桥臂0有效
  57.         GPIOB->DDR=GPIOB->DDR|0x7;//PB012配置为输出模式
  58.         GPIOB->CR1=GPIOB->CR1|0x7;//PB012推挽模式
  59.         GPIOB->ODR&=0xf8;//关闭下桥臂开关管
  60.        
  61.         //PC123 上桥臂1有效
  62.         GPIOC->DDR=GPIOC->DDR|0x0E;//PC123配置为输出模式
  63.         GPIOC->CR1=GPIOC->CR1|0x0E;//PC123推挽模式
  64.         GPIOC->ODR&=~(0x0E);//关闭下桥臂开关管
  65. }

  66. void Tim1_init(void)
  67. {
  68.         //计数器禁止、ARR预装载禁止、边沿对齐模式
  69.         TIM1->CR1 = 0x04;

  70.         TIM1->SMCR = 0;//禁止从模式

  71.         TIM1->IER = 0;//禁止所有中断

  72.         TIM1->CCER1 = 0; //禁止PWM输出
  73.         TIM1->CCER2 = 0;

  74.         TIM1->CCMR1 = 0x60; //PWM1模式,禁止预装载
  75.         TIM1->CCMR2 = 0x60;
  76.         TIM1->CCMR3 = 0x60;

  77.         //prescale = div1 @ 16MHz -> 62.5ns/count, Full scale = 4.09ms
  78.         TIM1->PSCRH = 0;
  79.         TIM1->PSCRL = 0;

  80.         TIM1->ARRH=hArrPwmVal/256; //PWM周期设定
  81.         TIM1->ARRL=hArrPwmVal%256;

  82.         //disable repetition counter
  83.         TIM1->RCR = 0;

  84.   TIM1->CCR1H=0;TIM1->CCR1L=0;//占空比输出均为0
  85.   TIM1->CCR2H=0;TIM1->CCR1L=0;
  86.   TIM1->CCR3H=0;TIM1->CCR1L=0;
  87.        
  88.         //使能定时计数器
  89.         TIM1->CR1 |= 0x01;
  90. }

  91. main()
  92. {
  93.         unsigned int tem_c=0;
  94.         unsigned char B_k1=0,B_k2=0;
  95.         unsigned int ADConverValue=0;
  96.        
  97.         for(tem_c=0;tem_c<50000;tem_c++);
  98.         Clock_init();
  99.         GPIO_int();
  100.         LCD_Init();
  101.         LCD_Fill(0);
  102.   LCD_P8x16Str(12,0,"BLDC OPEN LOOP");  
  103.   LCD_P8x16Str(10,3,"PWM:");      
  104.         AD_int();
  105.        
  106.         OutPwmValue=MINVALUE;
  107.         PWM_IO_init();
  108.         Tim1_init();
  109.         Init_TIM2();
  110.         TIM2_InitCapturePolarity();
  111.         enableInterrupts();
  112.        
  113.        
  114.         while (1)
  115.         {
  116.           if((GPIOG->IDR&0x80)==0x80)B_k1=0; //PG7为高电平,未有按键
  117.                 else if(B_k1==0)//PG7按下时,指示灯亮
  118.                 {
  119.                         for(tem_c=0;tem_c<500;tem_c++);
  120.                         if((GPIOG->IDR&0x80)==0x00)
  121.                         {
  122.                                 B_k1=1;
  123.                                 GPIOA->ODR=0x30;
  124.                         }
  125.                 }
  126.                
  127.                 if((GPIOG->IDR&0x40)==0x40)B_k2=0; //PG6为高电平,未有按键
  128.                 else if(B_k2==0)//PG7按下时,指示灯灭
  129.                 {
  130.                         for(tem_c=0;tem_c<500;tem_c++);
  131.                         if((GPIOG->IDR&0x40)==0x00)
  132.                         {
  133.                                 B_k2=1;
  134.                                 GPIOA->ODR=0x0;
  135.                         }
  136.                 }
  137.                
  138.                 if(ADC2->CSR&0x80)
  139.                 {
  140.                         ADC2->CSR &= (u8)(~0x80);//清除EOC标志
  141.                         ADConverValue=ADC2->DRH*256+ADC2->DRL;
  142.                         ADC2->CR1 |= 0x01;//启动AD
  143.                                        
  144.                                         if(ADConverValue<MINVALUE)ADConverValue=MINVALUE;
  145.                                         else if(ADConverValue>MAXVALUE)ADConverValue=MAXVALUE;
  146.                                         OutPwmValue=ADConverValue;
  147.                                        
  148.                         Display_data(12,6,OutPwmValue/10,0);
  149.                         //显示输出的100%,
  150.                         //因为周期为:hArrPwmVal=1000,
  151.                         //所以:占空比计算为outPwmValue/1000*100
  152.                         //简化为OutPwmValue/10
  153.                 }
  154.                
  155.                 if(FaultF==1)
  156.                 {
  157.                         ComHandler();FaultF=2;
  158.                 }               
  159.         }
  160. }

  161. @near @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler (void)
  162. {
  163.     /* In order to detect unexpected events during development,
  164.        it is recommended to set a breakpoint on the following instruction.
  165.     */
  166.                 FaultF=1;
  167.     return;
  168. }
复制代码

所有资料51hei提供下载:
6 BLDC 开环调速.zip (396.25 KB, 下载次数: 55)
回复

使用道具 举报

ID:1 发表于 2018-9-13 05:04 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:412641 发表于 2019-1-10 10:41 | 显示全部楼层
不错的源程序,很有参考价值。
回复

使用道具 举报

ID:324611 发表于 2019-9-18 14:38 | 显示全部楼层
正在学习BLDC,学习了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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