您当前的位置: 首页 > 

张巧龙

暂无认证

  • 0浏览

    0关注

    1208博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

电赛 | 电源题软件如何准备?

张巧龙 发布时间:2021-06-20 12:36:04 ,浏览量:0

关注、星标公众号,直达精彩内容

摘要:PWM和SPWM在电源的备战中是很有必要的。基础的恒流源、恒压源需要使用PWM的占空比及频率来达到数控的作用,往后的逆变则需要用到SPWM。当然还有ADC、DAC、IIC、SPI、算法。

一、PWM/SPWM

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调试。是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。广泛应用在从测量、通信到功率控制与变换的许多领域中。

SPWM(Sinusoidal PWM) 法是一种比较成熟的、使用较广泛的PWM法。冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。SPWM法就是以该结论为理论基础,用脉冲宽度按正弦规律变化而和正弦波等效的PWM波形即SPWM波形控制逆变电路中开关器件的通断,使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等,通过改变调制波的频率和幅值则可调节逆变电路输出电压的频率和幅值。

1、CubeMX相关配置-PWM 使能PWM通道

在这里我将TIM2的Channel1设置为PWM输出通道(PWM Generation CHx 正向、PWM Generation CHxN 反向、PWM Generation CHx CHxN一对互补pwm输出)

使能PWM通道 配置频率及占空比

频率 = 定时器时钟 / (Prescaler 预分频 + 1)/ (Counter Period 计数值 + 1)Hz

占空比 = Pulse ( 对比值) / (C ounter Period 计数值)%

配置频率及占空比 2、编写业务代码-PWM
// 使能timx的通道y
HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_y);
// 修改timx的通道y的pwm比较值为z,即修改占空比
__HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_y, z);

pwm 的输出是很简单的,但是因为定时器的频率是有上限的通常需要在频率和pwm的精细度两者之间做取舍。所以你想做电源,那么你可以了解一下STM32F334这款处理器,它拥有一个高分辨率定时器 (HRTIM),能将定时器的频率倍频至4.096G。那你在频率和pwm的精细度两者都可以兼得。

SPWM 其实就是在 PWM 的基础上,让 PWM 的占空比做正弦变化。

3、CubeMX相关配置-SPWM

之前的 PWM 生成的操作不变,只需要开启一个新的定时器,配置完后需要开启定时器中断

开启一个新的定时器 4、使用软件生成正弦向量表-SPWM

SPWM 中值 = Pulse ( 对比值) /2SPWM 幅值 = Pulse ( 对比值) /2

周内点数影响频率与正弦波精细度。周内点数越大,频率越小、正弦波精细度越高。

使用软件生成正弦向量表 5、编写业务代码-SPWM
uint16_t sin[] = 
{
 1800,1913,2025,2137,2247,2356,2462,2566,2667,2764,
 2858,2947,3032,3112,3186,3256,3319,3377,3428,3473,
 3511,3543,3568,3585,3596,3600,3596,3585,3568,3543,
 3511,3473,3428,3377,3319,3256,3186,3112,3032,2947,
 2858,2764,2667,2566,2462,2356,2247,2137,2025,1913,
 1800,1686,1574,1462,1352,1243,1137,1033,932,835,
 741,652,567,487,413,343,280,222,171,126,
 88,56,31,14,3,0,3,14,31,56,
 88,126,171,222,280,343,413,487,567,652,
 741,835,932,1033,1137,1243,1352,1462,1574,1686
}
int main()
{
 HAL_TIM_PWM_Start(&htimx,TIM_CHANNEL_y); // 开启pwm输出
 HAL_TIM_Base_Start_IT(&htimz); //使能刚刚配置的定时器z
 while(1)
 {
 }
}
/**
* @brief 定时器中断的回调函数
* @param htim 触发中断的定时器
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 static int i = 0;
 if(++i == size)i = 0;
 if (htim->Instance == htim3.Instance)
 {
  __HAL_TIM_SET_COMPARE(&htimx, TIM_CHANNEL_y, sin[i]); //由向量表修改占空比
 }
}
二、ADC/SDADC/ADS

先介绍最简单的片上 ADC,通常是 12 位,精度则为 3.3/4096 v。读取 ADC 的方式有很多:

1、轮询

2、中断

3、DMA

因为在实际开发中仅有轮询和 DMA 存在使用场景,所以在这里我仅介绍轮询和DMA 的方式。

1、CubeMX相关配置-轮询方式 使能ADC引脚 2、编写业务代码-轮询方式
while(1)
{
 HAL_ADC_Start(&hadc1);//启动ADC装换
 HAL_ADC_PollForConversion(&hadc1, 50);//等待转换完成,第二个参数表示超时时间,
 单位ms.
 if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
 {
  AD_Value = HAL_ADC_GetValue(&hadc1);//读取ADC转换数据,数据为12位
  printf("[\tmain]info:v=%.1fmv\r\n",AD_Value*3300.0/4096);//打印日志
 }
}

前面介绍了通过 ADC 轮询的方式采集单通道的数据。现在介绍一下通过 DMA 方式采集多通道的数据。

3、CubeMX相关配置-DMA方式 3.1初始化两个ADC通道 3.2、配置相关属性
  • 使能扫描转换模式 (Scan Conversion Mode), 使能连续转换模式 (Continuous Conversion Mode)。

  • ADC 规则组选择转换通道数为 2(Number Of Conversion)。

  • 配置 Rank 的输入通道。

配置相关属性 3.3、添加 DMA

添加DMA设置,设置为连续传输模式,数据长度为字。

添加DMA 4、编写业务代码-DMA 方式

1、在main 函数前面添加变量。其中 ADC_Value 作为转换数据缓存数组,ad1,ad2 存储PA0(转换通道 0),PA1(转换通道1) 的电压值。


/* USER CODE BEGIN PV */
/* Private variables */
uint32_t ADC_Value[100];
uint8_t i;
uint32_t ad1,ad2;
/* USER CODE END PV */

2、在 while(1) 前面以 DMA 方式开启 ADC 装换。HAL_ADC_Start_DMA() 函数第二个参数为数据存储起始地址,第三个参数为 DMA 传输数据的长度。

/* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 100);
/* USER CODE END 2 */

由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组 ADC_Value)。ADC采集的数据从 ADC_Value[0] 一直存储到 ADC_Value[99],然后采集到的数据又重新存储到ADC_Value[0],一直到ADC_Value[99]。所以ADC_Value数组里面的数据会不断被刷新。

这个过程中是通过DMA控制的,不需要CPU参与。我们只需读取ADC_Value里面的数据即可得到 ADC 采集到的数据。其中ADC_Value[0]为通道 0(PA0) 采集的数据,ADC_Value[1]为通道 1(PA1) 采集的数据,ADC_Value[2]为通道 0 采集的数据,如此类推。数组偶数下标的数据为通道 0 采集数据,数组奇数下标的数据为通道1采集数据。

在while(1) 循环中添加应用程序,将采集的数据装换为电压值并输出。

/* USER CODE BEGIN WHILE */
while (1)
{
 /* USER CODE END WHILE */
 /* USER CODE BEGIN 3 */
 HAL_Delay(500);
 for(i = 0,ad1 =0,ad2=0; i             
关注
打赏
1665727216
查看更多评论
0.0420s