- void adc_motor_ctrl_input_init(void)
- {
- ADC_ConfigType adcConfig; /*! ADC初始化配置*/
- memset(&adcConfig, 0x00, sizeof(adcConfig)); /*! 清空结构体*/
- /*! ADC输入端口(电位器)配置*/
- GPIO_SetFunc(GPIOA, GPIO_PIN10, GPIO_FUN2); /*! PA10复用为FUN2,为ADC_IN1 ,对应电位器VR1*/
- /*! ADC配置
- ADC固定为12位分辨率,工作模式为MODE3(工作模式内容见参考手册8.4.2章节),规则组扫描+注入组扫描模式多通道单次转换,规则组长度为3,注入组长度为0
- 每触发一次进行一次ADC转换,每次转换规则组中的3个通道。
- */
- adcConfig.clkPsc = ADC_CLK_PRESCALER_2; /*! ADC时钟分频设置,Set ADC Clk = APB时钟频率/(clkPsc + 1) = 16M/2 = 8M */
- adcConfig.scanModeEn = ENABLE; /*! 模式配置SCAN:扫描模式使能位 多通道需使能扫描模式,单通道则不需要使能*/
- adcConfig.continuousModeEn = DISABLE; /*! 模式配置CONT:连续模式使能位 0:触发一次后只转换一次,1:触发后可连续转换*/
- adcConfig.regularDiscontinuousModeEn = DISABLE; /*! 模式配置DISCEN:打开规则组间断转换模式*/
- adcConfig.injectDiscontinuousModeEn = DISABLE; /*! 模式配置IDISEN:打开注入组间断转换模式*/
- adcConfig.injectAutoModeEn = DISABLE; /*! 模式配置IAUTO:自动注入模式*/
- adcConfig.intervalModeEn = DISABLE; /*! 模式配置INTERVAL:注入组为间隔转换模式*/
- adcConfig.regularDiscontinuousNum = 0; /*! 规则组子组长度,用于Mode7和Mode8*/
- adcConfig.interruptEn = DISABLE; /*! 总中断使能*/
- adcConfig.voltageRef = ADC_VOLTAGEREF_VDDA; /*! ADC参考源选择 */
- adcConfig.regularTriggerMode = ADC_TRIGGER_INTERNAL; /*! 规则组触发源类型选择*/
- adcConfig.injectTriggerMode = ADC_TRIGGER_INTERNAL; /*! 注入组触发源类型选择*/
- adcConfig.regularSequenceLength = 1; /*! 规则组长度*/
- adcConfig.injectSequenceLength = 0; /*! 注入组长度*/
- adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT; /*! 数据右对齐*/
- adcConfig.callBack = NULL; /*! ADC回调函数*/
- adcConfig.powerMode = ADC_POWER_ON; /*! ADC上电*/
- ADC_Init(ADC0, &adcConfig); /*! ADC works Mode Config*/
- /*!
- ADC转换率计算公式:
- 总转换时间=(SPT+ 12)/ADC时钟频率+5个APB时钟周期
- 备注:
- 1.SPT为采样周期个数,具体见下面ADC_SPT_CLK_x。
- 2.ADC时钟频率 = APB时钟频率 /(分频系数+1)
- 3.7802x ADC支持的最高采样率为250Ksps(即转换时间不低于4us),如果配置采样率高于该值,可能会导致采样结果精度显著减低。
- */
- /*规则组通道转换序列和转换速率配置*/
- ADC_SetRegularGroupChannel(ADC0, ADC_CH_1, ADC_SPT_CLK_33, 0); /*! 采样&转换时间= (33+12)/8000000 + 5/16000000 ≈ 5.94us */
- /*! Bandgap或T-sensor内部通道配置*/
- //ADC_SetInternalChannel(ADC0, ADC_INTERNAL_TSENSOR); /*! 内部电压信号选择(仅在使用了ADC_CH_VIN 时配置) */
- ADC_SetVBufEnableFlag(ADC0, ENABLE); /*! Bandgap和T-sensor内部通道使能(仅在使用了ADC_CH_VIN 时配置) */
- }
ADC值读取
- uint16_t adc_motor_ctrl_get_adc_Val(void)
- {
- uint16_t adcVal = 0;
- ADC_SoftwareStartRegularConvert(ADC0); /*! 软件触发规则组采样*/
- while (!ADC_GetEOCFlag(ADC0, 0)) /*! 等待规则组最后一个通道转换完成*/
- {
- /* Wait */
- }
- adcVal = ADC_GetRegularData(ADC0, 0); /*! 获取规则组0的转换值*/
- return adcVal;
- }
PWM模块是PWM模块驱动代码,为上层提供PWM初始化以及配置占空比驱动函数。接口如下:
- void PWM_motor_ctrl_output_init( void );
- void PWM_motor_ctrl_ouput_duty_val(uint16_t pwm_duty);
PWM 输出初始化
- void PWM_motor_ctrl_output_init( void )
- {
- /* USER CODE BEGIN PWM2_Init 0 */
- /* USER CODE END PWM2_Init 0 */
- PWM_ConfigType pwmConfig;
- memset(&pwmConfig, 0, sizeof(pwmConfig));
- PWM_ModulationConfigType initModeStruct;
- memset(&initModeStruct, 0, sizeof(initModeStruct));
- /* USER CODE BEGIN PWM2_Init 1 */
- GPIO_SetFunc(GPIOA, GPIO_PIN3, GPIO_FUN1);
- /* USER CODE END PWM2_Init 1 */
- pwmConfig.mode = PWM_MODE_MODULATION;
- pwmConfig.clkSource = PWM_CLK_SOURCE_APB;
- pwmConfig.clkPsc = 0;
- pwmConfig.initValue = 0;
- pwmConfig.maxValue = 4095;
- pwmConfig.overflowInterrupEn = DISABLE;
- pwmConfig.cntOverflowFreq = 0;
- pwmConfig.interruptEn = DISABLE;
- initModeStruct.countMode = PWM_UP_COUNT;
- initModeStruct.deadtime = 0;
- initModeStruct.deadtimePsc = PWM_DEADTIME_DIVID_1;
- initModeStruct.initChOutputEn = ENABLE;
- initModeStruct.initTriggerEn = DISABLE;
- PWM_IndependentChConfig independentChConfig[1];
- /* independent channel 0 configuration */
- independentChConfig[0].channel = PWM_CH_0;
- independentChConfig[0].chValue = 0;
- independentChConfig[0].levelMode = PWM_LOW_TRUE;
- independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_LOW;
- independentChConfig[0].interruptEn = DISABLE;
- independentChConfig[0].initLevel = PWM_HIGH_LEVEL;
- independentChConfig[0].triggerEn = DISABLE;
- initModeStruct.independentChannelNum = 1;
- initModeStruct.independentChConfig = independentChConfig;
- pwmConfig.initModeStruct = &initModeStruct;
- PWM_Init(PWM2, &pwmConfig);
- /* USER CODE BEGIN PWM2_Init 2 */
- /* USER CODE END PWM2_Init 2 */
- }
PWM 占空比设置
- void PWM_motor_ctrl_ouput_duty_val(uint16_t pwm_duty)
- {
- PWM_SetChannelCountValue(PWM2, PWM_CH_0, pwm_duty);
- }
电机任务是上层应用层接口,调用ADC模块读取ADC数值,写入PWM占空比设置函数。
电机控制任务
- void motor_Task( void *pvParameters )
- {
- pvParameters = pvParameters;
- adc_motor_ctrl_input_init();
- PWM_motor_ctrl_output_init();
- while (1) {
- PWM_motor_ctrl_ouput_duty_val( adc_motor_ctrl_get_adc_Val() );
- vTaskDelay( pdMS_TO_TICKS(100) );
- }
- }
最终文件结构如下:
演示
代码:
AC7802_FreeRTOS_Motor.zip
(2.51 MB, 下载次数: 23)