QQT912/CW32F030/原项目程序/SW/12 CW32 BLDC haLL pid OK/USER/MAIN.c

307 lines
8.4 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
2页菜单:1:设定速度、实时速度; 2:母线电压、电流显示。
KEY1:按键切换速度及电压电流菜单
KEY2:方向切换按键。电机运行时也可以切换。LED2亮灭表示不同的方向。
KEY3:电机启停控制,LED3灯亮时,电机处于启动状态; LED3灯来时,电机处于停止状态;
电位器调速,切换到速度菜单,可以显示当前设定转速。
Designed by Cache.lee from UET company
Tel:18129915976
*/
#include "main.h"
#include "motor.h"
#include "globalv.h"
#include "init.h"
#include "pid.h"
#include "compu.h"
#include "control.h"
//#include "OLED_I2C.h"
unsigned int Menu=0;
//UARTx
#define DEBUG_USARTx CW_UART3
#define DEBUG_USART_CLK RCC_APB1_PERIPH_UART3
#define DEBUG_USART_APBClkENx RCC_APBPeriphClk_Enable1
#define DEBUG_USART_BaudRate 115200
#define DEBUG_USART_UclkFreq 64000000
//UARTx GPIO
#define DEBUG_USART_GPIO_CLK RCC_AHB_PERIPH_GPIOB
#define DEBUG_USART_TX_GPIO_PORT CW_GPIOB
#define DEBUG_USART_TX_GPIO_PIN GPIO_PIN_6
#define DEBUG_USART_RX_GPIO_PORT CW_GPIOB
#define DEBUG_USART_RX_GPIO_PIN GPIO_PIN_7
//GPIO AF
#define DEBUG_USART_AFTX PB06_AFx_UART3TXD()
#define DEBUG_USART_AFRX PB07_AFx_UART3RXD()
#ifdef __GNUC__
/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
* @brief 配置UART
*
*/
void UART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//外设时钟使能
RCC_AHBPeriphClk_Enable(DEBUG_USART_GPIO_CLK, ENABLE);
DEBUG_USART_APBClkENx(DEBUG_USART_CLK, ENABLE);
//UART TX RX 复用
DEBUG_USART_AFTX;
DEBUG_USART_AFRX;
GPIO_InitStructure.Pins = DEBUG_USART_TX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pins = DEBUG_USART_RX_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = DEBUG_USART_BaudRate;
USART_InitStructure.USART_Over = USART_Over_16;
USART_InitStructure.USART_Source = USART_Source_PCLK;
USART_InitStructure.USART_UclkFreq = DEBUG_USART_UclkFreq;
USART_InitStructure.USART_StartBit = USART_StartBit_FE;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(DEBUG_USARTx, &USART_InitStructure);
}
/**
* @brief Retargets the C library printf function to the USART.
*
*/
PUTCHAR_PROTOTYPE
{
USART_SendData_8bit(DEBUG_USARTx, (uint8_t)ch);
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return ch;
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
void PowerOnDelay(void)
{
unsigned int i;
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
for(i=0;i<60000;i++);
KKN=(MAXSPEED-MINSPEED);
KKN=KKN/(NMAXVD-NMINVD);
}
unsigned int hte=0;
int main()
{
unsigned char DZCount=0;
char temp_buff[100],temp_buff1[50];
// unsigned char key_1=0;
PowerOnDelay();
RCC_Configuration(); //时钟配置
UART_Configuration();
GPIOInit(); //GPIO配置
LEDON();
ADC_Configuration(); //AD配置
PWMtimer_init();
BTIM_init();
Halltimer_init();
//printf("ADC[0]:%d ADC[1]:%d ADC[2]:%d ADC[3]:%d\r\n",SampleData[0],SampleData[1],SampleData[2],SampleData[3]);
PWM_AL_ON;
PWM_BL_ON;
PWM_CL_ON;
TimeCountTemp=0;
while(TimeCountTemp<50);
TimeCountTemp=0;
PWM_AL_OFF;
PWM_BL_OFF;
PWM_CL_OFF;
// I2C_init(); //OLED init
// I2C_OLED_Init();
// I2C_OLED_Clear(1);
// I2C_OLED_UPdata();
//
printf("Update %s %s\r\n",__DATE__,__TIME__);
printf("ADC[0]:%d ADC[1]:%d ADC[2]:%d ADC[3]:%d\r\n",SampleData[0],SampleData[1],SampleData[2],SampleData[3]);
SampleVI(); //采集电压电流
startflag=1;
EnDirCheck();
DIin=0x500; //偏置电流设定 0.9V-1.1V中间,认为正确
if(SampleData[1]>1117&&SampleData[1]<=1500)DIin=SampleData[1];
else printf("Current read err\r\n");
if(SampleData[2]>3000|| SampleData[2]<700) printf("Speed read err\r\n");
if(HALL_Check()==0|| HALL_Check()==7) printf("HALL Read Err\r\n");
if(CanshuV<30) printf("Votage read err\r\n");
sprintf(temp_buff1,"Set :%4d RPM ",SetSpeed); //输出显示占空比
sprintf(temp_buff,"Real:%4d RPM ",RealS); //显示电机转速
printf("%s\r\n",temp_buff);
printf("%s\r\n",temp_buff1);
sprintf(temp_buff1,"Vbus :%d.%d V ",CanshuV/10,CanshuV%10); //输出显示占空比
sprintf(temp_buff,"I(MA):%d ",CanshuI); //显示电机转速
printf("%s\r\n",temp_buff);
printf("%s\r\n",temp_buff1);
GPIO_WritePin(VOUT_EN_GPIO_PORT,VOUT_EN_GPIO_PIN,GPIO_Pin_SET); //12V输出
while(1)
{
if(TimeCountCompuSpeed>20) //20MS采集一次速度设定值,并检查HALL是否有误
{
TimeCountCompuSpeed=0;
SampleSpeed();
HALL_Check();
}
if(TimeCountVI>=200)//100MS计算一次电压电流,并作一次实时速度计算
{
printf("ADC[0]:%d ADC[1]:%d ADC[2]:%d ADC[3]:%d\r\n",SampleData[0],SampleData[1],SampleData[2],SampleData[3]);
TimeCountVI=0;
SampleVI();
RealS=hte*50/MPolePairs;//HALLcount1*10*60/6/MPolePairs; 100MS存储一次霍尔边沿数
if(MOTORSTATE==STATESTARTPID||MOTORSTATE==STATERUNPID)
{
if(RealS==0)
{
DZCount++;
if(DZCount>=10)//2S保护
{
DZCount=0;ErrorCode=7;//堵转
}
}
else DZCount=0;
}
}
if(ErrorCode!=0&&MOTORSTATE!=STATEERROR&&MOTORSTATE!=STATEERROROVER)//发生故障
{
MOTORSTATE=STATEERROR;
printf("ErrorCode=%d\r\n",ErrorCode);
GPIO_WritePin(VOUT_EN_GPIO_PORT,VOUT_EN_GPIO_PIN,GPIO_Pin_RESET); //12V输出
}
if(TimeCountkey>=500) //500ms刷新显示
{
LEDTOG();
TimeCountkey=0;
// if(Menu==0)
// {
sprintf(temp_buff1,"Set :%4d RPM ",SetSpeed); //输出显示占空比
sprintf(temp_buff,"Real:%4d RPM ",RealS); //显示电机转速
printf("%s\r\n",temp_buff);
printf("%s\r\n",temp_buff1);
// }
// else
// {
sprintf(temp_buff1,"Vbus :%d.%d V ",CanshuV/10,CanshuV%10); //输出显示占空比
sprintf(temp_buff,"I(MA):%d ",CanshuI); //显示电机转速
// }
printf("%s\r\n",temp_buff);
printf("%s\r\n",temp_buff1);
// printf("MOTORSTATE=%d\r\n",MOTORSTATE);
// I2C_OLED_ShowString(0,0,temp_buff1);
// I2C_OLED_ShowString(0,15,temp_buff);
// I2C_OLED_UPdata();
}
MotorBreak();
EnDirCheck();
//状态机
switch(MOTORSTATE)
{
case STATESTARTCHECK:
MotorStartCheck();
break;
case STATESTARTPID:
MotorStartPID();
break;
case STATERUNPID:
MotorRunPID();
break;
case STATESTOP: MotorStop();break;
case STATEERROR: MotorError();break;
case STATEERROROVER: MotorErrorOver();break;
}
}
}
//1ms 定时器
void BTIM1_IRQHandler(void)
{
/* USER CODE BEGIN */
if(BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{ //1MS timer
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
TimeCountTemp++;
TimeCountCompuSpeed++; //计算速度
TimeCountRealSpd++; //瞬时速度
if(TimeCountAvgSpd>=200){hte=HALLcount1;HALLcount1=0;TimeCountAvgSpd=0;}//用于显示的速度值
if(TimeCountRealSpd>=20){HALLcountTemp=HALLcount;HALLcount=0;TimeCountRealSpd=0;}
TimeCountPID++; //PID
TimeCountAvgSpd++; //平均速度
TimeCountVI++;//计算电压电流
TimeCountkey++;
}
/* USER CODE END */
}