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

脉冲宽度调制(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输出)

频率 = 定时器时钟 / (Prescaler 预分频 + 1)/ (Counter Period 计数值 + 1)Hz
占空比 = Pulse ( 对比值) / (C ounter Period 计数值)%

// 使能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 生成的操作不变,只需要开启一个新的定时器,配置完后需要开启定时器中断

SPWM 中值 = Pulse ( 对比值) /2SPWM 幅值 = Pulse ( 对比值) /2
周内点数影响频率与正弦波精细度。周内点数越大,频率越小、正弦波精细度越高。

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相关配置-轮询方式
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通道
使能扫描转换模式 (Scan Conversion Mode), 使能连续转换模式 (Continuous Conversion Mode)。
ADC 规则组选择转换通道数为 2(Number Of Conversion)。
配置 Rank 的输入通道。

添加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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?


微信扫码登录