久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3427|回復: 3
打印 上一主題 下一主題
收起左側

BLDC開環調速源程序

[復制鏈接]
跳轉到指定樓層
樓主
BLDC開環調速

單片機源程序如下:
  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, 下載次數: 58)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久白浊 | 亚洲一区久久 | 欧美综合一区 | 91视视频在线观看入口直接观看 | 欧美二区在线 | 国产午夜精品一区二区三区嫩草 | 成人免费视频久久 | 国产激情视频网址 | 久久免费精品 | 国产精品成人在线 | 精品欧美乱码久久久久久 | 青青久在线视频 | 日韩黄| 亚洲国产成人精品久久久国产成人一区 | 一级做受毛片免费大片 | 日韩中文字幕在线播放 | 亚洲久久| 一区免费看 | 亚洲人一区| 一级视频在线免费观看 | 亚洲 欧美 另类 综合 偷拍 | 国产ts人妖一区二区三区 | h视频网站在线观看 | 久久国色 | 色悠悠久 | 九色视频网站 | 国产精品美女久久久久久久久久久 | 午夜在线精品 | 91精品国产综合久久精品 | 免费av直接看 | 国产成人网 | 日韩国产一区二区 | 国产超碰人人爽人人做人人爱 | 日韩视频精品在线 | 爱草视频| 婷婷久久精品一区二区 | 欧美精品一区在线 | 超碰国产在线 | 中文字幕一区二区三区不卡 | 二区中文| 91精品国产麻豆 |