FOC程序cubemx配置-ADC配置

文章讲述了作者在配置ADC采样过程中遇到的问题,如波形显示未知信号和非互补波形,通过调整TIM中断设置解决了这些问题。介绍了ADC采样两种模式:单ADC注入组采样和多个ADC共享触发源,以优化电流采样效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体配置步骤大家参考:这篇文章  

本文源码下载链接:FOC控制算法程序(单电压闭环、电压+电流闭环源码)资源-优快云文库

一、ADC采样问题

我配置后用keil5自带的仿真工具查看引脚波形,在这里写一下遇到的问题。

1、波形仿真的时候出现 Unknown Signal:参考 这篇文章

2、生成的波形并不完全互补。

PS:出现以上这种情况时,当时在网上查了各种资料还是没找到原因,这里也是一直想不明白,唉,苦苦挣扎好久。

直到我看到这句话:

定时器Update中断触发位置都是在中间的时刻,但最后我采用的是在ADC采集完成的回调函数中进行FOC运算。

原来我在配置cubemx中打开了 TIM update interrupt 这个开关。

TIM_IT_Update:更新中断,计数器向上溢出/向下溢出,计数器初始化

然后我在程序中分别尝试打开或关闭函数__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);

 (1)关闭更新中断

(2)打开更新中断

二、ADC采样两种模式

1、一个ADC注入组采样

在cubemx里有以下采样选项:

        Injected Rank :这个就是注入序列,一旦ADC开始注入转换,就会按照Rank1-2-3-4的顺序依次进行采样,每个rank只能选择一个对应的通道,一个通道可以被多个rank选择。而在本例中,一旦定时器1通道4的pwm产生下降沿,ADC1就会对通道0进行一次采样,然后对通道1采样,最后对通道2采样。三个序列采样完成后,注入组会停下来等待下一个下降沿来临。
        Sampling Time :采样时间,因为foc电流采样是一个分秒必争的过程,所以采样时间尽可能的要短,这里选择3周期,最大也不要大于15周期。

在我的程序中是这样写的:

unsigned short analogRead(unsigned char ch)   
{
//采用ADC组的方法
	switch(ch){
		case 0:  return hadc1.Instance->JDR1;break;
		case 1:  return hadc1.Instance->JDR2;break;
		case 2:  return hadc1.Instance->JDR3;break;
		case 3:  return hadc1.Instance->JDR4;break;
		default: return 0;
	}
}

// function reading an ADC value and returning the read voltage
float _readADCVoltageInline(unsigned char ch)
{
  unsigned short raw_adc = analogRead(ch);
  return (float)raw_adc*3.3/4096;
}

2、多个ADC使用同一个触发源

        虽然我们的ADC采样时间很短(3个通道加起来可能不过5us,不过前提是采样周期为3周期),但是占空比高的时候留给我们采样的时间也很短。如果使用3个ADC同时触发,可以一次采样时间采完三相电流。而且,虽然连续采样的间隔很短,但仍然是有时间差的,这样我们采集到的三相电流就不是同一时刻的,效果更好。

这里程序稍后更新。。。。
 

### STM32 FOC ADC配置方法 对于STM32进行FOC(磁场定向控制)时,ADC配置至关重要。STM32F4系列的ADC模块具备强大的功能,能够满足高精度电流采样需求。 #### 中断配置 为了确保在ADC转换完成后能立即处理数据,在配置过程中应启用相应的中断设置。这可以通过修改`ADC_IRQHANDLER`函数来实现,当完成一次转换后会触发该中断服务程序[^1]。 ```c void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { /* 用户自定义代码 */ } ``` 此回调函数会在每次ADC转换结束时被调用,允许实时获取并处理最新的测量值。 #### 初始化参数设定 针对具体应用场合下的初始化工作如下: - **通道选择**: 对于三相逆变器而言,通常需要监控三个半桥臂上端连接点处电压信号;因此需指定相应输入引脚作为模拟量采集源。 - **分辨率调整**: 根据实际精度要求适当调节位数,默认情况下为12bit模式即可满足大多数情况的需求。 - **扫描方式开启**: 若多路信道参与轮询,则要打开SCAN选项以使能连续自动切换检测对象的功能。 以下是基于CubeMX生成的基础框架之上补充完善后的部分核心片段: ```c static void MX_ADC_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // 同步预分频系数设为PCLK/4 hadc.Init.Resolution = ADC_RESOLUTION_12B; // 设置分辨率为12比特 hadc.Init.ScanConvMode = ENABLE; // 开启扫描模式 hadc.Init.ContinuousConvMode = DISABLE; // 关闭连续转换模式 hadc.Init.DiscontinuousConvMode = DISABLE; // 禁止不连续转换模式 hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件启动单次转换 hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐 hadc.Init.NbrOfConversion = 3; // 总共读取三次样本 if (HAL_ADC_Init(&hadc) != HAL_OK) { Error_Handler(); } /** Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_0 | ADC_CHANNEL_1 | ADC_CHANNEL_2 ;// 定义使用的通道号 sConfig.Rank = ADC_RANK Channel_NUMBER ; sConfig.SamplingTime= ADC_SAMPLETIME_3CYCLES ; // 设定采样时间为3周期 if(HAL_ADC_ConfigChannel(&hadc,&sConfig)!=HAL_OK){ Error_Handler(); // 错误处理机制 } } /* ADC interrupt handler function */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle) { static uint16_t adcValue[3]; memcpy((uint8_t*)adcValue,(uint8_t*)(__HAL_ADC_GET_REG_VALUE(AdcHandle->Instance)),sizeof(uint16_t)*3); // Process your data here... } ``` 上述代码展示了如何通过软件编程的方式激活特定事件发生时产生的硬件级通知,并且实现了基本的数据接收逻辑。需要注意的是,这里仅提供了一个简化版的例子供参考学习之用,在真实项目开发中可能还需要考虑更多细节因素的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洲洲不是州州

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值