BLDC开环调速
单片机源程序如下:
- /*
- PG6键按下时,PA4 PA5指示灯亮,
- PG7按下时PA4 PA5 指示灯灭。
- 无启停,上电开环调速,最大可设为100%,但要有一定的最少值
- 电机转动需要一点初始力
- 有感120度HALL。
- 开关控制采用上高下低有效电平设置
- 上桥 臂采用PWM功能。
- Designed by Cache.Lee
- 2013.4.2
- */
- #include "stm8s.h"
- #include "OLED12864.h"
- #include "hall.h"
- #define STM8_FREQ_MHZ 16
- #define PWM_FREQUENCY 16000
- static const u16 hArrPwmVal = ((u16)((STM8_FREQ_MHZ * (u32)1000000)/PWM_FREQUENCY));
- //hArrPwmVal=1000
- #define MINPWMPERCENT 10
- #define MAXPWMPERCENT 100
- #define MINVALUE MINPWMPERCENT*10
- //hArrPwmVal=1000
- //MINPWMPERCENT*hArrPwmVal/100简化为MINPWMPERCENT*10
- #define MAXVALUE MAXPWMPERCENT*10
- //MAXPWMPERCENT*hArrPwmVal/100简化MAXPWMPERCENT*0
- void GPIO_int(void)//初始化按键,指示灯
- {
- GPIOG->DDR=GPIOG->DDR&0x3f;//PG6,PG7按键配置为输入模式
- GPIOG->CR1=GPIOG->CR1|0xC0;//PG6,PG7按键配置为上拉输入
- GPIOA->DDR=GPIOA->DDR|0x30;//PA4,PA5指示灯配置为输出模式
- GPIOA->CR1=GPIOA->CR1|0x30;//PA4,PA5指示灯d配置为推挽模式
- GPIOA->ODR=0x00;//点亮指示灯
- }
- void Clock_init(void)//时钟配置 内部16M
- {
- CLK->CKDIVR=0;
- }
- void AD_int(void)//电位器 PF5 初始化 AIN13
- {
- u8 value;
- u16 ADC_TDR_tmp;
-
- ADC2->CSR = 13; //AIN13通道选择
- //select 4MHz clock based on 16MHz fMaster (div4), single mode
- ADC2->CR1 = 0x20;
- ADC2->CR2 = 0x08;//数据右对齐
- ADC2->TDRH=0x20;//AIN13 禁止施密特触发
- ADC2->CR1 |= 0X01;//使能ADC
-
- value=30;
- while(value--); //等待ADC稳定
- ADC2->CSR &= 0x7f;//清EOC标志
- ADC2->CR1 |= 0x01;//启动AD
- }
- void PWM_IO_init(void)
- { //PB012 下桥臂0有效
- GPIOB->DDR=GPIOB->DDR|0x7;//PB012配置为输出模式
- GPIOB->CR1=GPIOB->CR1|0x7;//PB012推挽模式
- GPIOB->ODR&=0xf8;//关闭下桥臂开关管
-
- //PC123 上桥臂1有效
- GPIOC->DDR=GPIOC->DDR|0x0E;//PC123配置为输出模式
- GPIOC->CR1=GPIOC->CR1|0x0E;//PC123推挽模式
- GPIOC->ODR&=~(0x0E);//关闭下桥臂开关管
- }
- void Tim1_init(void)
- {
- //计数器禁止、ARR预装载禁止、边沿对齐模式
- TIM1->CR1 = 0x04;
- TIM1->SMCR = 0;//禁止从模式
- TIM1->IER = 0;//禁止所有中断
- TIM1->CCER1 = 0; //禁止PWM输出
- TIM1->CCER2 = 0;
- TIM1->CCMR1 = 0x60; //PWM1模式,禁止预装载
- TIM1->CCMR2 = 0x60;
- TIM1->CCMR3 = 0x60;
- //prescale = div1 @ 16MHz -> 62.5ns/count, Full scale = 4.09ms
- TIM1->PSCRH = 0;
- TIM1->PSCRL = 0;
- TIM1->ARRH=hArrPwmVal/256; //PWM周期设定
- TIM1->ARRL=hArrPwmVal%256;
- //disable repetition counter
- TIM1->RCR = 0;
- TIM1->CCR1H=0;TIM1->CCR1L=0;//占空比输出均为0
- TIM1->CCR2H=0;TIM1->CCR1L=0;
- TIM1->CCR3H=0;TIM1->CCR1L=0;
-
- //使能定时计数器
- TIM1->CR1 |= 0x01;
- }
- main()
- {
- unsigned int tem_c=0;
- unsigned char B_k1=0,B_k2=0;
- unsigned int ADConverValue=0;
-
- for(tem_c=0;tem_c<50000;tem_c++);
- Clock_init();
- GPIO_int();
- LCD_Init();
- LCD_Fill(0);
- LCD_P8x16Str(12,0,"BLDC OPEN LOOP");
- LCD_P8x16Str(10,3,"PWM:");
- AD_int();
-
- OutPwmValue=MINVALUE;
- PWM_IO_init();
- Tim1_init();
- Init_TIM2();
- TIM2_InitCapturePolarity();
- enableInterrupts();
-
-
- while (1)
- {
- if((GPIOG->IDR&0x80)==0x80)B_k1=0; //PG7为高电平,未有按键
- else if(B_k1==0)//PG7按下时,指示灯亮
- {
- for(tem_c=0;tem_c<500;tem_c++);
- if((GPIOG->IDR&0x80)==0x00)
- {
- B_k1=1;
- GPIOA->ODR=0x30;
- }
- }
-
- if((GPIOG->IDR&0x40)==0x40)B_k2=0; //PG6为高电平,未有按键
- else if(B_k2==0)//PG7按下时,指示灯灭
- {
- for(tem_c=0;tem_c<500;tem_c++);
- if((GPIOG->IDR&0x40)==0x00)
- {
- B_k2=1;
- GPIOA->ODR=0x0;
- }
- }
-
- if(ADC2->CSR&0x80)
- {
- ADC2->CSR &= (u8)(~0x80);//清除EOC标志
- ADConverValue=ADC2->DRH*256+ADC2->DRL;
- ADC2->CR1 |= 0x01;//启动AD
-
- if(ADConverValue<MINVALUE)ADConverValue=MINVALUE;
- else if(ADConverValue>MAXVALUE)ADConverValue=MAXVALUE;
- OutPwmValue=ADConverValue;
-
- Display_data(12,6,OutPwmValue/10,0);
- //显示输出的100%,
- //因为周期为:hArrPwmVal=1000,
- //所以:占空比计算为outPwmValue/1000*100
- //简化为OutPwmValue/10
- }
-
- if(FaultF==1)
- {
- ComHandler();FaultF=2;
- }
- }
- }
- @near @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler (void)
- {
- /* In order to detect unexpected events during development,
- it is recommended to set a breakpoint on the following instruction.
- */
- FaultF=1;
- return;
- }
复制代码
所有资料51hei提供下载:
6 BLDC 开环调速.zip
(396.25 KB, 下载次数: 58)
|