• FOC程序cubemx配置-ADC配置


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

    一、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周期。

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

    1. unsigned short analogRead(unsigned char ch)
    2. {
    3. //采用ADC组的方法
    4. switch(ch){
    5. case 0: return hadc1.Instance->JDR1;break;
    6. case 1: return hadc1.Instance->JDR2;break;
    7. case 2: return hadc1.Instance->JDR3;break;
    8. case 3: return hadc1.Instance->JDR4;break;
    9. default: return 0;
    10. }
    11. }
    12. // function reading an ADC value and returning the read voltage
    13. float _readADCVoltageInline(unsigned char ch)
    14. {
    15. unsigned short raw_adc = analogRead(ch);
    16. return (float)raw_adc*3.3/4096;
    17. }

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

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

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

  • 相关阅读:
    周赛372(正难则反、枚举+贪心、异或位运算、离线+单调栈)
    Linux 进程概念和状态
    Web APIs——事件监听以及案例
    前端性能优化方法面试题回答思路总结
    大咖说|翼辉丁晓华:我们已经真正意义上感受到了原始创新带来的巨大价值
    (五)共享模型之管程【wait notify 】
    数据结构初步(九)- 栈和队列oj练习
    【Vue】v-if和v-show的区别
    乳企齐冲上市,是百家争鸣还是内卷加剧?
    桥接模式简介
  • 原文地址:https://blog.csdn.net/qq_41834692/article/details/133521736