diff --git a/Project/HC32F460/MDK/.vscode/c_cpp_properties.json b/Project/HC32F460/MDK/.vscode/c_cpp_properties.json index efcaf70..1c9fea8 100644 --- a/Project/HC32F460/MDK/.vscode/c_cpp_properties.json +++ b/Project/HC32F460/MDK/.vscode/c_cpp_properties.json @@ -3,19 +3,16 @@ { "name": "Debug", "includePath": [ - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\driver\\inc", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\mcu\\common", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\User\\Inc", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\Debug", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\SDCard", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\FatFS\\source", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\LIS2HH12", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\RS485", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\mcu\\common", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\User\\Inc", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\User\\Src", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\driver\\src", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\driver\\inc", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\Module\\CS1237", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\Module\\dc_motor", "C:\\Keil_v5\\ARM\\ARMCC\\include", "C:\\Keil_v5\\ARM\\ARMCC\\include\\rw", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\MDK", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\User\\Src", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\driver\\src" + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\MDK" ], "defines": [ "__DEBUG", @@ -100,21 +97,18 @@ { "name": "Release", "includePath": [ - "d:\\CUI\\Electronics\\SynologyDrive\\mcu\\common", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source", - "d:\\CUI\\Electronics\\SynologyDrive\\driver\\inc", - "d:\\CUI\\Electronics\\SynologyDrive\\bsp\\ev_hc32f460_lqfp100_v2", + "d:\\CUI\\SynologyDrive\\JOB\\mcu\\common", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source", + "d:\\CUI\\SynologyDrive\\JOB\\driver\\inc", + "d:\\CUI\\SynologyDrive\\JOB\\bsp\\ev_hc32f460_lqfp100_v2", "C:\\Keil_v5\\ARM\\ARMCC\\include", "C:\\Keil_v5\\ARM\\ARMCC\\include\\rw", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\MDK", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\mcu\\common", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\User\\Src", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\driver\\src", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\Debug", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\SDCard", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\FatFS\\source", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\LIS2HH12", - "d:\\CUI\\Electronics\\SynologyDrive\\HC32F460PRO\\HC32F460JEUA-SonarSenser_V1.5-2024-04-10\\Project\\SonarSensor\\source\\Module\\RS485" + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\MDK", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\mcu\\common", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\driver\\src", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\User\\Src", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\Module\\CS1237", + "d:\\CUI\\SynologyDrive\\JOB\\Project\\HC32F460\\Project\\HC32F460\\source\\Module\\dc_motor" ], "defines": [ "HC32F460", diff --git a/Project/HC32F460/MDK/.vscode/keil-assistant.log b/Project/HC32F460/MDK/.vscode/keil-assistant.log index 139626a..eba32ca 100644 --- a/Project/HC32F460/MDK/.vscode/keil-assistant.log +++ b/Project/HC32F460/MDK/.vscode/keil-assistant.log @@ -20,3 +20,17 @@ [info] Log at : 2024/6/12|17:35:35|GMT+0800 +[info] Log at : 2025/9/17|09:28:29|GMT+0800 + +[info] Log at : 2025/9/17|09:28:37|GMT+0800 + +[info] Log at : 2025/9/17|11:25:21|GMT+0800 + +[info] Log at : 2025/9/17|11:30:43|GMT+0800 + +[info] Log at : 2025/9/18|09:27:20|GMT+0800 + +[info] project closed: HC32F460 +[info] Log at : 2025/9/19|10:56:08|GMT+0800 + +[info] project closed: HC32F460 diff --git a/Project/HC32F460/MDK/HC32F460.uvoptx b/Project/HC32F460/MDK/HC32F460.uvoptx index c738b1b..69ea6a3 100644 --- a/Project/HC32F460/MDK/HC32F460.uvoptx +++ b/Project/HC32F460/MDK/HC32F460.uvoptx @@ -153,7 +153,44 @@ +<<<<<<< HEAD +======= + + + 0 + 0 + 291 + 1 +
4146
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\source\Module\dc_motor\dc_motor.c + + \\BombSensor\../source/Module/dc_motor/dc_motor.c\291 +
+ + 1 + 0 + 343 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\source\Module\dc_motor\dc_motor.c + + +
+
+>>>>>>> Motor_Test 0 @@ -225,6 +262,11 @@ 1 App.CentreRunFalg,0x0A + + 18 + 1 + g_motor_data + @@ -240,7 +282,11 @@ 0 1 +<<<<<<< HEAD 1 +======= + 0 +>>>>>>> Motor_Test 0 0 0 diff --git a/Project/HC32F460/source/Module/dc_motor/dc_motor.c b/Project/HC32F460/source/Module/dc_motor/dc_motor.c index cd67c6a..f2e52ca 100644 --- a/Project/HC32F460/source/Module/dc_motor/dc_motor.c +++ b/Project/HC32F460/source/Module/dc_motor/dc_motor.c @@ -1,6 +1,7 @@ #include "dc_motor.h" #include "hc32_ddl.h" #include "Debug.h" +#include "math.h" @@ -30,8 +31,8 @@ void DCMOTORDBGOnOff(uint8_t OnOff) DBG_LOG("\r\nDcMotor Display Disable!\r\n"); } - - +#if(MCU == HC32F460JETA) +#if(0) //旧版本PCB /* Timer4 CNT */ #define TIMER4_UNIT (M4_TMR41) #define TIMER4_CNT_CYCLE_VAL (500u) /* Timer4 counter cycle value */ @@ -47,9 +48,331 @@ void DCMOTORDBGOnOff(uint8_t OnOff) #define TIMER4_PWM_H_PIN (Pin08) #define TIMER4_PWM_L_PORT (PortB) /* TIM4_1_OUL_B:PE8 TIM4_1_OVL_B:PE10 TIM4_1_OWL_B:PE12 */ #define TIMER4_PWM_L_PIN (Pin13) +#endif + +#if(1) //V2.1版本PCB +/* Timer4 CNT */ +#define TIMER4_UNIT (M4_TMR41) +#define TIMER4_CNT_CYCLE_VAL (500u) /* Timer4 counter cycle value */ + +/* Timer4 OCO */ +#define TIMER4_OCO_HIGH_CH (Timer4OcoOvh) /* only Timer4OcoOuh Timer4OcoOvh Timer4OcoOwh */ + +/* Timer4 PWM */ +#define TIMER4_PWM_CH (Timer4PwmV) /* only Timer4PwmU Timer4PwmV Timer4PwmW */ + +#define TIMER4_PWM_H_PORT (PortA) /* TIM4_1_OUH_B:PE9 TIM4_1_OVH_B:PE11 TIM4_1_OWH_B:PE13 */ +#define TIMER4_PWM_H_PIN (Pin09) +#define TIMER4_PWM_L_PORT (PortB) /* TIM4_1_OUL_B:PE8 TIM4_1_OVL_B:PE10 TIM4_1_OWL_B:PE12 */ +#define TIMER4_PWM_L_PIN (Pin14) +#endif +uint16_t init_adc_val; +uint16_t AdcInitCnt = 0; + + +#define Adc 0.80566 //3.3/4096=0.00080566 //ADC分辨率 + +uint16_t g_adc_val[ADC_CH_NUM]; +extern uint16_t m_au16Adc1SaValue[ADC_CH_NUM * ADC_COLL]; + +/************************************* 第二部分 电压电流温度采集 **********************************************/ + +/* + Rt = Rp *exp(B*(1/T1-1/T2)) + + Rt 是热敏电阻在T1温度下的阻值; + Rp是热敏电阻在T2常温下的标称阻值; + exp是e的n次方,e是自然常数,就是自然对数的底数,近似等于 2.7182818; + B值是热敏电阻的重要参数,教程中用到的热敏电阻B值为3380; + 这里T1和T2指的是开尔文温度,T2是常温25℃,即(273.15+25)K + T1就是所求的温度 +*/ + +const float Rp = 10000.0f; /* 10K */ +const float T2 = (273.15f + 25.0f); /* T2 */ +const float Bx = 3380.0f; /* B */ +const float Ka = 273.15f; + +/** + * @brief 计算温度值 + * @param para: 温度采集对应ADC通道的值(已滤波) + * @note 计算温度分为两步: + 1.根据ADC采集到的值计算当前对应的Rt + 2.根据Rt计算对应的温度值 + * @retval 温度值 + */ +float get_temp(uint16_t para) +{ + float Rt; + float temp; + + /* + 第一步: + Rt = 3.3 * 4700 / VTEMP - 4700 ,其中VTEMP就是温度检测通道采集回来的电压值,VTEMP = ADC值* 3.3/4096 + 由此我们可以计算出当前Rt的值:Rt = 3.3f * 4700.0f / (para * 3.3f / 4096.0f ) - 4700.0f; + */ + + Rt = 3.3f * 4700.0f / (para * 3.3f / 4096.0f ) - 4700.0f; /* 根据当前ADC值计算出Rt的值 */ + + /* + 第二步: + 根据当前Rt的值来计算对应温度值:Rt = Rp *exp(B*(1/T1-1/T2)) + */ + + temp = Rt / Rp; /* 解出exp(B*(1/T1-1/T2)) ,即temp = exp(B*(1/T1-1/T2)) */ + temp = log(temp); /* 解出B*(1/T1-1/T2) ,即temp = B*(1/T1-1/T2) */ + temp /= Bx; /* 解出1/T1-1/T2 ,即temp = 1/T1-1/T2 */ + temp += (1.0f / T2); /* 解出1/T1 ,即temp = 1/T1 */ + temp = 1.0f / (temp); /* 解出T1 ,即temp = T1 */ + temp -= Ka; /* 计算T1对应的摄氏度 */ + return temp; /* 返回温度值 */ +} + +/** + * @brief 计算ADC的平均值(滤波) + * @param * p :存放ADC值的指针地址 + * @note 此函数对电压、温度、电流对应的ADC值进行滤波, + * p[0]-p[2]对应的分别是电压、温度和电流 + * @retval 无 + */ +void calc_adc_val(uint16_t * p) +{ + uint32_t temp[3] = {0,0,0}; + int i; + for(i=0;i= 1; i--) /* 冒泡排序*/ + { + for (j = 0; j < (i - 1); j++) + { + if (speed_arr[j] > speed_arr[j + 1]) /* 数值比较 */ + { + temp = speed_arr[j]; /* 数值换位 */ + speed_arr[j] = speed_arr[j + 1]; + speed_arr[j + 1] = temp; + } + } + } + + temp = 0.0; + + for (i = 2; i < 8; i++) /* 去除两边高低数据 */ + { + temp += speed_arr[i]; /* 将中间数值累加 */ + } + + temp = (float)(temp / 6); /*求速度平均值*/ + + /* 一阶低通滤波 + * 公式为:Y(n)= qX(n) + (1-q)Y(n-1) + * 其中X(n)为本次采样值;Y(n-1)为上次滤波输出值;Y(n)为本次滤波输出值,q为滤波系数 + * q值越小则上一次输出对本次输出影响越大,整体曲线越平稳,但是对于速度变化的响应也会越慢 + */ + g_motor_data.speed = (float)( ((float)0.48 * temp) + (g_motor_data.speed * (float)0.52) ); + k = 0; + } + sp_count = 0; + } + sp_count ++; +} + +/***************************************************************************************** +* 函数名称: get_current +* 功能描述: 获取工作电流函数 +* 参 数: 无 +* 返 回 值: 电流值 +*****************************************************************************************/ +float get_current(void) +{ + return g_motor_data.current; /* 返回工作电流值 */ +} + +/***************************************************************************************** +* 函数名称: get_volatage +* 功能描述: 获取工作电压函数 +* 参 数: 无 +* 返 回 值: 电压值 +*****************************************************************************************/ +float get_volatage(void) +{ + return g_motor_data.volatage; /* 返回工作电压值 */ +} + +/***************************************************************************************** +* 函数名称: get_Temperature +* 功能描述: 获取工作温度函数 +* 参 数: 无 +* 返 回 值: 温度值 +*****************************************************************************************/ +float get_Temperature(void) +{ + return g_motor_data.current; /* 返回工作温度值 */ +} + +/***************************************************************************************** +* 函数名称: get_speed +* 功能描述: 获取电机实际转速值函数 +* 参 数: 无 +* 返 回 值: 电压值 +*****************************************************************************************/ +float get_speed(void) +{ + return g_motor_data.speed; /* 返回电机实际转速值 */ +} + +/***************************************************************************************** +* 函数名称: get_location +* 功能描述: 获取电机实际位置函数 +* 参 数: 无 +* 返 回 值: 电压值 +*****************************************************************************************/ +float get_location(void) +{ + return g_motor_data.speed; /* 返回电机实际位置 */ +} + + +/***************************************************************************************** +* 函数名称: Adc1mSRoutine +* 功能描述: Adc 1毫秒服务函数 +* 参 数: 无 +* 返 回 值: 无 +*****************************************************************************************/ +bool AdcInitStatus = false; //ADC初始化状态标志位 +volatile bool AdcInitSta = false; //ADC电流电压采集初始化标志位 +uint16_t AdcDly = 0; //ADC采样定时计数 +void Adc1mSRoutine(void) +{ + if(AdcInitStatus == false) + AdcInitStatus = true; + if(AdcInitSta == true) + { + ADC_Start(); + } + if(AdcDly > 0) + AdcDly--; +} + + +/***************************************************************************************** +* 函数名称: AdcLoopHander +* 功能描述: Adc主循环函数 +* 参 数: 无 +* 返 回 值: 无 +*****************************************************************************************/ +void AdcLoopHander(void) +{ + uint32_t temp = 0; + int i; + float temp_c = 0.0; + //开机等待电流数据稳定1秒,采集稳定电流值为初始值 + if((AdcInitStatus == true) && (AdcInitSta == false)) + { + ADC_Start(); + + AdcInitCnt++; + if(AdcInitCnt < 1000) + { + AdcInitStatus = false; + return; + } + else + { + while(DMA_GetChFlag(M4_DMA1, DmaCh0Sta) != DmaTransferComplete); + for(i=0;i 0) + { + init_adc_val /= 2; /* 取平均值 */ + } + } + DCMOTOR_DBG_LOG("init_adc_val %d.\n", init_adc_val); + AdcInitSta = true; + } + } + //计算ADC采样值并滤波 + if(AdcDly == 0) + { + float BatVoltage = 0; + AdcDly = 1000; + if(AdcInitSta != false) + { + while(DMA_GetChFlag(M4_DMA1, DmaCh0Sta) != DmaTransferComplete); + DMA_Cmd(M4_DMA1, Disable); + calc_adc_val(g_adc_val); /* 计算ADC的平均值 */ + + DCMOTOR_DBG_LOG("ADC1_IN1 value %d.\t Temp:%.1fC \r\n", g_adc_val[0u], get_temp((float)g_adc_val[0]*Adc)); + DCMOTOR_DBG_LOG("ADC2_IN2 value %d.\t Valtage:%.1fV \r\n", g_adc_val[1u], (float)g_adc_val[1]*ADC2VBUS); + temp_c = (g_adc_val[2]-init_adc_val)*ADC2CURT; + DCMOTOR_DBG_LOG("ADC3_IN3 value %d.\t Current:%.1fmA \r\n", g_adc_val[2u], temp_c); + +// g_motor_data.current = temp_c; + + g_motor_data.current = (float)((g_motor_data.current * (float)0.60) + ((float)0.40 * temp_c)); /* 一阶低通滤波 */ + if (abs(g_motor_data.current) <= 20) /* 过滤掉微弱浮动电流 */ + { + g_motor_data.current = 0.0; + } + DCMOTOR_DBG_LOG("\t\t\t g_motor_data.current:%.1fmA \r\n", g_motor_data.current); + DMA_Cmd(M4_DMA1, Enable); + } + } +} + @@ -86,7 +409,7 @@ void Timer41_Init(uint8_t dir) /* Enable peripheral clock */ - PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM41 | PWC_FCG2_PERIPH_TIM42 | PWC_FCG2_PERIPH_TIM43, Enable); + PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM41, Enable); /* Timer4 CNT : Initialize CNT configuration structure */ stcCntInit.enBufferCmd = Disable; @@ -178,10 +501,14 @@ void Timer41_Init(uint8_t dir) PORT_SetFunc(TIMER4_PWM_L_PORT, TIMER4_PWM_L_PIN, Func_Tim4, Disable); /* Timer4 PWM: Initialize PWM configuration structure */ + //重载定时器中断 stcPwmInit.enRtIntMaskCmd = Enable; - stcPwmInit.enClkDiv = PwmPlckDiv1; - stcPwmInit.enOutputState = E_PWM_OS; /*输出PWMH信号不改变电平,输出PWML信号反转*/ - stcPwmInit.enMode = PwmThroughMode; + //计数时钟分频 + stcPwmInit.enClkDiv = PwmPlckDiv1; /*滤波计数器和死区计数器的计数时钟分频*/ + //PWM输出极性控制 + stcPwmInit.enOutputState = E_PWM_OS; /*输出PWMH信号不改变电平,输出PWML信号反转*/ + //PWM输出模式 + stcPwmInit.enMode = PwmThroughMode; /*直通模式*/ TIMER4_PWM_Init(TIMER4_UNIT, TIMER4_PWM_CH, &stcPwmInit); /* Initialize timer4 pwm */ /* Clear && Start CNT */ @@ -355,19 +682,19 @@ void dcmotor_init(void) stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enPinOType = Pin_OType_Cmos; stcPortInit.enPinDrv = Pin_Drv_H; - stcPortInit.enPullUp = Disable; + stcPortInit.enPullUp = Enable; PORT_Init(SHUTDOWN1_GPIO_Port, SHUTDOWN1_Pin, &stcPortInit); PORT_SetBits(SHUTDOWN1_GPIO_Port, SHUTDOWN1_Pin); - PORT_Init(PortA, Pin03, &stcPortInit); - PORT_SetBits(PortA, Pin03); - /* SD拉低,关闭输出 */ - - dcmotor_stop(); /* 停止电机 */ - dcmotor_dir(0); /* 设置正转 */ - dcmotor_speed(0); /* 速度设置为0 */ - dcmotor_start(); /* 开启电机 */ +// PORT_Init(PortA, Pin03, &stcPortInit); +// PORT_SetBits(PortA, Pin03); +// /* SD拉低,关闭输出 */ +// +// dcmotor_stop(); /* 停止电机 */ +// dcmotor_dir(0); /* 设置正转 */ +// dcmotor_speed(0); /* 速度设置为0 */ +// dcmotor_start(); /* 开启电机 */ } /** @@ -493,6 +820,8 @@ void dcmotor_speed(uint16_t para) } } +#endif + /** * @brief 电机控制 * @param para: pwm比较值 ,正数电机为正转,负数为反转 diff --git a/Project/HC32F460/source/Module/dc_motor/dc_motor.h b/Project/HC32F460/source/Module/dc_motor/dc_motor.h index d7e319c..8125ac2 100644 --- a/Project/HC32F460/source/Module/dc_motor/dc_motor.h +++ b/Project/HC32F460/source/Module/dc_motor/dc_motor.h @@ -2,19 +2,37 @@ #ifndef __DCMOTOR_H #define __DCMOTOR_H -#include "hc32_ddl.h" +#define ADC_CH_NUM 3 /* 需要转换的通道数目 */ +#define ADC_COLL 100 /* 单采集次数 */ +#define ADC_SUM ADC_CH_NUM * ADC_COLL /* 总采集次数 */ + +#define HC32F170 (0u) //HC32F170JATA +#define HC32L170 (1u) //HC32L170JATA +#define HC32F460JETA (2u) //HC32F460JETA + +#define MCU HC32F460JETA + +#if(MCU == HC32F460JETA) +#include "hc32_ddl.h" + #define TIMER4 0 #define TIMER6 1 -#define TIMER TIMER4 +#define TIMER TIMER4 //HC32F460单片机PWM输出控制定时器选择 +#endif + // 电机控制参数 #define PWM_PERIOD TIM_PERIOD // PWM周期值 (ARR) #define MAX_SPEED 480 // 最大速度(PWM占空比) #define ACCEL_STEP 10 // 加速步进值 #define DECEL_STEP 10 // 减速步进值 +<<<<<<< HEAD #define ACCEL_INTERVAL 10 // 加减速间隔(ms) +======= +#define ACCEL_INTERVAL 2 // 加减速间隔(ms) +>>>>>>> Motor_Test @@ -43,22 +61,80 @@ typedef enum { +/************************************* 第一部分 电压电流温度采集 ******************************/ + +/* 电流计算公式: + * I=(最终输出电压-初始参考电压)/(6*0.02)A + * ADC值转换为电压值:电压=ADC值*3.3/4096,这里电压单位为V,我们换算成mV,4096/1000=4.096,后面就直接算出为mA + * 整合公式可以得出电流 I= (当前ADC值-初始参考ADC值)* (3.3 / 4.096 / 0.12) + */ +#define ADC2CURT (float)(3.3f / 4.096f / 0.12f) + +/* 电压计算公式: + * V_POWER = V_BUS * 25 + * ADC值转换为电压值:电压=ADC值*3.3/4096 + * 整合公式可以得出电压V_POWER= ADC值 *(3.3f * 25 / 4096) + */ +#define ADC2VBUS (float)(3.3f * 25 / 4096) + + + + +/*****************************************************************************************************/ + + + /* 停止引脚操作宏定义 * 此引脚控制H桥是否生效以达到开启和关闭电机的效果 */ -#define SHUTDOWN1_Pin Pin12 +#define SHUTDOWN1_Pin Pin07 #define SHUTDOWN1_GPIO_Port PortB //#define SHUTDOWN2_Pin GPIO_PIN_2 //#define SHUTDOWN2_GPIO_Port GPIOF #define SHUTDOWN_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOF_CLK_ENABLE(); }while(0) /* PF口时钟使能 */ +#if(MCU == HC32F460JETA) /* 电机停止引脚定义 这里默认是接口1 */ #define ENABLE_MOTOR PORT_SetBits(SHUTDOWN1_GPIO_Port,SHUTDOWN1_Pin) #define DISABLE_MOTOR PORT_ResetBits(SHUTDOWN1_GPIO_Port,SHUTDOWN1_Pin) - +#endif /******************************************************************************************/ +/* 编码器参数结构体 */ +typedef struct +{ + int encode_old; /* 上一次计数值 */ + int encode_now; /* 当前计数值 */ + float speed; /* 编码器速度 */ +} ENCODE_TypeDef; + +extern ENCODE_TypeDef g_encode; /* 编码器参数变量 */ + + +/************************************* 第三部分 编码器测速 ****************************************************/ + +#define ROTO_RATIO 44 /* 线数*倍频系数,即11*4=44 */ +#define REDUCTION_RATIO 30 /* 减速比30:1 */ + +/* 电机参数结构体 */ +typedef struct +{ + uint8_t state; /*电机状态*/ + float current; /*电机电流*/ + float volatage; /*电机电压*/ + float power; /*电机功率*/ + float speed; /*电机实际速度*/ + float location; /*电机位置*/ + int32_t motor_pwm; /*设置比较值大小 */ +} Motor_TypeDef; + +extern Motor_TypeDef g_motor_data; /*电机参数变量*/ + +/*********************************************************************************************************************/ + + + void dcmotor_init(void); /* 直流有刷电机初始化 */ void dcmotor_start(void); /* 开启电机 */ void dcmotor_stop(void); /* 关闭电机 */ @@ -67,14 +143,27 @@ void dcmotor_speed(uint16_t para); /* void motor_pwm_set(float para); /* 电机控制 */ +float get_temp(uint16_t para); +void AdcLoopHander(void); +void Adc1mSRoutine(void); +void Adc_Init(void); +void calc_adc_val(uint16_t * p); +void Encoder (void); +//外部调用接口函数 MotorDirection Motor_GetDirection(void);/* 获取电机转动方向 */ void Motor_Control(MotorCommand cmd); /* 电机控制 */ void Dcmotor1msRoutine(void); void DcmotorLoopHandler(void); +float get_current(void); /* 获取工作电流 */ +float get_volatage(void); /* 获取工作电压 */ +float get_Temperature(void); /* 获取工作温度 */ +float get_speed(void); /* 获取电机转速 */ +float get_location(void); /* 获取电机位置 */ + #endif diff --git a/Project/HC32F460/source/User/Inc/bsp.h b/Project/HC32F460/source/User/Inc/bsp.h index d7bddbc..1b45351 100644 --- a/Project/HC32F460/source/User/Inc/bsp.h +++ b/Project/HC32F460/source/User/Inc/bsp.h @@ -11,12 +11,12 @@ /*模块启用与关闭*/ #define USE_DEBUG 1 //DEBUG开关,0、关闭,1、启用 -#define USE_AD 0 //AD获取选择,0、关闭,1、启用 +#define USE_AD 1 //AD获取选择,0、关闭,1、启用 #define USE_WDT 0 //看门狗选择,0、关闭,1启用 #define USE_EXFALSE 0 //外部FALSE存储选择,0、关闭,1、启用 #define USE_RTC 0 //RTC时钟开关,0、关闭,1、开启 #define USE_LPTIM0 0 //LPTIM0开关,0、关闭,1、开启 -#define USE_DMA 0 //DMA开关,0、关闭,1、开启 +#define USE_DMA 1 //DMA开关,0、关闭,1、开启 #define USE_RS485 0 //RS485开关,0、关闭,1、启用 #define USE_I2C1 0 //I2C1开关,0、关闭,1、启用 #define USE_SPI1 0 //SPI1开关,0、关闭,1、启用 diff --git a/Project/HC32F460/source/User/Src/bsp.c b/Project/HC32F460/source/User/Src/bsp.c index 881234b..c52c53c 100644 --- a/Project/HC32F460/source/User/Src/bsp.c +++ b/Project/HC32F460/source/User/Src/bsp.c @@ -8,6 +8,7 @@ #include "CS1237_RIGHTUP.h" #include "CS1237_RIGHTLOW.h" +#include "dc_motor.h" #define SPI_MASTER_MODE #define SPI3_MASTER_MODE @@ -16,7 +17,7 @@ static void SystemClockConfig(void); -uint16_t m_au16Adc1SaValue[4]; +uint16_t m_au16Adc1SaValue[ADC_CH_NUM * ADC_COLL]; void FlashWrite(uint32_t *wData, uint32_t wLen) { @@ -1165,15 +1166,15 @@ static void AdcSetChannelPinMode(uint32_t u32Channel) static void AdcChannelConfig(void) { stc_adc_ch_cfg_t stcChCfg; - uint8_t au8Adc1SaSampTime[4] = {255, 255, 255, 255}; + uint8_t au8Adc1SaSampTime[3] = {2255, 255, 255}; MEM_ZERO_STRUCT(stcChCfg); - stcChCfg.u32Channel = ADC1_CH0 | ADC1_CH1 | ADC1_CH2 | ADC1_CH3; + stcChCfg.u32Channel = ADC1_CH1 | ADC1_CH2 | ADC1_CH3; stcChCfg.u8Sequence = ADC_SEQ_A; stcChCfg.pu8SampTime = au8Adc1SaSampTime; - AdcSetChannelPinMode(ADC1_CH0); +// AdcSetChannelPinMode(ADC1_CH0); AdcSetChannelPinMode(ADC1_CH1); AdcSetChannelPinMode(ADC1_CH2); AdcSetChannelPinMode(ADC1_CH3); @@ -1212,12 +1213,12 @@ static void AdcDmaConfig(void) MEM_ZERO_STRUCT(stcDmaCfg); - stcDmaCfg.u16BlockSize = 4; + stcDmaCfg.u16BlockSize = 3; stcDmaCfg.u16TransferCnt = 0u; - stcDmaCfg.u32SrcAddr = (uint32_t)(&M4_ADC1->DR0); + stcDmaCfg.u32SrcAddr = (uint32_t)(&M4_ADC1->DR1); stcDmaCfg.u32DesAddr = (uint32_t)(m_au16Adc1SaValue); - stcDmaCfg.u16DesRptSize = 4; - stcDmaCfg.u16SrcRptSize = 4; + stcDmaCfg.u16DesRptSize = ADC_SUM; + stcDmaCfg.u16SrcRptSize = 3; stcDmaCfg.u32DmaLlp = 0u; stcDmaCfg.stcSrcNseqCfg.u16Cnt = 0u; stcDmaCfg.stcSrcNseqCfg.u32Offset = 0u; @@ -1230,7 +1231,7 @@ static void AdcDmaConfig(void) stcDmaCfg.stcDmaChCfg.enSrcNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enDesNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enTrnWidth = Dma16Bit; - stcDmaCfg.stcDmaChCfg.enLlpEn = Disable; + stcDmaCfg.stcDmaChCfg.enLlpEn = Enable; /* Enable DMA interrupt. */ stcDmaCfg.stcDmaChCfg.enIntEn = Enable; @@ -1362,9 +1363,9 @@ void BSP_Init(void) //SdioInit(); //Spi_Config(); // Spi3_Config(); - - //Adc1_Config(); - //Dma_Config(); + dcmotor_init(); + Adc1_Config(); + Dma_Config(); //FeedDog(); SysTick_Init(1000u); diff --git a/Project/HC32F460/source/User/Src/main.c b/Project/HC32F460/source/User/Src/main.c index 742f3c3..1919926 100644 --- a/Project/HC32F460/source/User/Src/main.c +++ b/Project/HC32F460/source/User/Src/main.c @@ -833,6 +833,7 @@ int main(void) #endif ReadLoopHandler(); DcmotorLoopHandler(); + AdcLoopHander(); AppLoopHandler(); } } @@ -853,6 +854,7 @@ void SysTick_IrqHandler(void) RIGHTUP_CS12371mSRoutine(); RIGHTLOW_CS12371mSRoutine(); Dcmotor1msRoutine(); + Adc1mSRoutine(); } /***************************************************************************************** @@ -875,5 +877,6 @@ void RtcPeriod_IrqCallback(void) void ADC_DMA_CallBack(void) { + }