DSP移相控制

//###############################################################################################

// Description:

// program for 4路PWM信号,每路以A为准,B与之互补,带死区。移相以第一路信号(EPWM1A)为基准

// $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $

// $Release Date: July 30, 2017 $

// $Copyright: Copyright 孙川(Sun Chuan) $

//###############################################################################################

#include "DSP28x_Project.h"    

void InitExInt(void);

void InitEPwm1Example(void);

void InitEPwm2Example(void);

void InitEPwm3Example(void);

void InitEPwm4Example(void);

//interrupt void epwm1_isr(void);

//interrupt void epwm2_isr(void);

//interrupt void epwm3_isr(void);

//interrupt void epwm4_isr(void);

// Configure the period for each timer

//第一路

volatile Uint16 EPWM1_TIMER_TBPRD = 1500;  // Period=1501 TBCLK counts

volatile Uint16 EPWM1_CMPA = 750;          // Set 50% 占空比 for EPWM1A -> S1

//第二路

volatile Uint16 EPWM2_TIMER_TBPRD = 1500;  

volatile Uint16 EPWM2_CMPA = 750;          

//第三路

volatile Uint16 EPWM3_TIMER_TBPRD = 1500;  

volatile Uint16 EPWM3_CMPA = 750;

//第四路

volatile Uint16 EPWM4_TIMER_TBPRD = 1500;

volatile Uint16 EPWM4_CMPA = 750;

volatile Uint16 D1 = 50;   //第一路与第二路之间的移相角 若D1=x,则D1对应0.24*x度,例如x=50时,D1对应12度

volatile Uint16 D2 = 100;  //第一路与第三路之间的移相角

volatile Uint16 D3 = 72;   //第一路与第四路之间的移相角

#define DBTIME_FED 28  死区设置

#define DBTIME_RED 28

void main(void)

{

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the DSP2833x_SysCtrl.c file.

   InitSysCtrl();

// Step 2. Initialize GPIO:

// This example function is found in the DSP2833x_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

// InitGpio();  // Disenable pull-up on GPIO0 ~ GPIO11

// For this case just init GPIO pins for ePWM1, ePWM2, ePWM3, ePWM4

// These functions are in the DSP2833x_EPwm.c file

   InitEPwm1Gpio();

   InitEPwm2Gpio();

   InitEPwm3Gpio();

   InitEPwm4Gpio();

// Step 3. Clear all interrupts and initialize PIE vector table:

// Disable CPU interrupts

   DINT;

// Initialize the PIE control registers to their default state.

// The default state is all PIE interrupts disabled and flags

// are cleared.

// This function is found in the DSP2833x_PieCtrl.c file.

   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:

   IER = 0x0000;

   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the interrupt

// is not used in this example.  This is useful for debug purposes.

// The shell ISR routines are found in DSP2833x_DefaultIsr.c.

// This function is found in DSP2833x_PieVect.c.

   InitPieVectTable();

   MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);  //烧录进Flash中运行

   InitFlash();

   InitExInt();

   EALLOW;

   PieVectTable.XINT1 = &ISRExint1;

   EDIS;

   PieCtrlRegs.PIEIER1.bit.INTx4= 1;    // Enable XINT1 in the PIE: Group1 interrupt4

// Interrupts that are used in this example are re-mapped to

// ISR functions found within this file.

   EALLOW;  // This is needed to write to EALLOW protected registers

//   PieVectTable.EPWM1_INT = &epwm1_isr;

//   PieVectTable.EPWM2_INT = &epwm2_isr;

//   PieVectTable.EPWM3_INT = &epwm3_isr;

//   PieVectTable.EPWM4_INT = &epwm4_isr;

   EDIS;    // This is needed to disable write to EALLOW protected registers

// Step 4. Initialize all the Device Peripherals:

// This function is found in DSP2833x_InitPeripherals.c

// InitPeripherals();  // Not required for this example

// For this example, only initialize the ePWM

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Disable TBCLK within the ePWM

   EDIS;

   InitEPwm1Example();

   InitEPwm2Example();

   InitEPwm3Example();

   InitEPwm4Example();

   EALLOW;

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK within the ePWM

   EDIS;

// Step 5. User specific code, enable interrupts:

// Enable CPU INT3 which is connected to EPWM1-3 INT:

   IER |= M_INT3;

// Enable EPWM INTn in the PIE: Group 3 interrupt 1-4

//   PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

//   PieCtrlRegs.PIEIER3.bit.INTx2 = 1;

//   PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

//   PieCtrlRegs.PIEIER3.bit.INTx4 = 1;

// Enable global Interrupts and higher priority real-time debug events:

   EINT;   // Enable Global interrupt INTM

   ERTM;   // Enable Global realtime interrupt DBGM

// Step 6. IDLE loop. Just sit and loop forever (optional):

   for(;;)

   {

       __asm("          NOP");

   }

}

//interrupt void epwm1_isr(void)

//{

//   //update

//

//   // Clear INT flag for this timer

//   EPwm1Regs.ETCLR.bit.INT = 1;

//

//   // Acknowledge this interrupt to receive more interrupts from group 3

//  PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

//}

//interrupt void epwm2_isr(void)

//{

//   //update

//

//   // Clear INT flag for this timer

//   EPwm2Regs.ETCLR.bit.INT = 1;

//

//   // Acknowledge this interrupt to receive more interrupts from group 3

//   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

//}

//

//interrupt void epwm3_isr(void)

//{

//   //update

//

//   // Clear INT flag for this timer

//   EPwm3Regs.ETCLR.bit.INT = 1;

//

//   // Acknowledge this interrupt to receive more interrupts from group 3

//   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

//}

//interrupt void epwm4_isr(void)

//{

//   //update

//

//   // Clear INT flag for this timer

//   EPwm4Regs.ETCLR.bit.INT = 1;

//

//   // Acknowledge this interrupt to receive more interrupts from group 3

//   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;

//}

void InitEPwm1Example()

{

   // Setup TBCLK

   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count up_mode

   EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;           // Set timer period

   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Master module

   EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;

   EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;    // Sync down-stream module

   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0

   EPwm1Regs.TBCTR = 0x0000;                      // Clear counter

   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT

   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

   // Setup shadow register load on ZERO

   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   // Set Compare values

   EPwm1Regs.CMPA.half.CMPA = EPWM1_CMPA;        // Set compare A value

   // Set actions

   EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;            // Set PWM1A on ZRO

   EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;          // Clear PWM1A on CAU

   // Set Dead-band module

   EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module

   EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // Active Hi complementary

   EPwm1Regs.DBFED = DBTIME_FED;

   EPwm1Regs.DBRED = DBTIME_RED;

   // Interrupt where we will change the Compare Values

   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event

   EPwm1Regs.ETSEL.bit.INTEN = 1;                // Enable INT

   EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event

}

void InitEPwm2Example()

{

   // Setup TBCLK

   EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count updown

   EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;           // Set timer period

   EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;         // Slave module

   EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;

   EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;     // Sync flow-through

   EPwm2Regs.TBPHS.half.TBPHS = 1500 - D1;               // Set Phase shift angle between S1 and S5 to x/1500*360 = 0.24x deg

   EPwm2Regs.TBCTR = 0x0000;                      // Clear counter

   EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT

   EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;

   // Setup shadow register load on ZERO

   EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

   EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   // Set Compare values

   EPwm2Regs.CMPA.half.CMPA = EPWM2_CMPA;         // Set compare A value

   // Set actions

   EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;             // Set PWM2A on ZRO

   EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;           // Clear PWM2A on CAU

   // Set Dead-band module

   EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module

   EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // Active Hi complementary

   EPwm2Regs.DBFED = DBTIME_FED;

   EPwm2Regs.DBRED = DBTIME_RED;

   // Interrupt where we will change the Compare Values

   EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;        // Select INT on Zero event

   EPwm2Regs.ETSEL.bit.INTEN = 1;                   // Enable INT

   EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;              // Generate INT on 1st event

}

void InitEPwm3Example(void)

{

   // Setup TBCLK

   EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count updown

   EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD;           // Set timer period

   EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;         // Slave module

   EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;

   EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;     // Sync flow-through

   EPwm3Regs.TBPHS.half.TBPHS = 1500 - D2;               // Set Phase shift angle between S1 and S6 to x/1500*360 = 0.24x deg

   EPwm3Regs.TBCTR = 0x0000;                      // Clear counter

   EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT

   EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;

   // Setup shadow register load on ZERO

   EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

   EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   // Set Compare values

   EPwm3Regs.CMPA.half.CMPA = EPWM3_CMPA;   // Set compare A value

   // Set Actions

   EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;         // Set PWM3A on ZRO

   EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;       // Clear PWM3A on CAU

   // Set Dead-band module

   EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module

   EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // Active Hi complementary

   EPwm3Regs.DBFED = DBTIME_FED;

   EPwm3Regs.DBRED = DBTIME_RED;

   // Interrupt where we will change the Compare Values

   EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event

   EPwm3Regs.ETSEL.bit.INTEN = 1;                // Enable INT

   EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event

}

void InitEPwm4Example(void)

{

   // Setup TBCLK

   EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;     // Count updown

   EPwm4Regs.TBPRD = EPWM4_TIMER_TBPRD;           // Set timer period

   EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;         // Slave module

   EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW;

   EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;     // Sync flow-through

   EPwm4Regs.TBPHS.half.TBPHS = 1500 - D2 - D3;               // Set Phase shift angle between S1 and S6 to x/1500*360 = 0.24x deg

   EPwm4Regs.TBCTR = 0x0000;                      // Clear counter

   EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // Clock ratio to SYSCLKOUT

   EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

   // Setup shadow register load on ZERO

   EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;

   EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;

   EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;

   EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   // Set Compare values

   EPwm4Regs.CMPA.half.CMPA = EPWM4_CMPA;   // Set compare A value

   // Set Actions

   EPwm4Regs.AQCTLA.bit.ZRO = AQ_SET;         // Set PWM4A on ZRO

   EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR;       // Clear PWM4A on CAU

   // Set Dead-band module

   EPwm4Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module

   EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // Active Hi complementary

   EPwm4Regs.DBFED = DBTIME_FED;

   EPwm4Regs.DBRED = DBTIME_RED;

   // Interrupt where we will change the Compare Values

   EPwm4Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event

   EPwm4Regs.ETSEL.bit.INTEN = 1;                // Enable INT

   EPwm4Regs.ETPS.bit.INTPRD = ET_1ST;           // Generate INT on 1st event

}

//===========================================================================

// No more.

//===========================================================================

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java10年技术架构演进

一、前言 又快到了1024,现代人都喜欢以日期的特殊含义来纪念属于自己的节日。虽然有点牵强,但是做件事情,中国人总喜欢找个节日来纪念,程序员也是一样。甚至连1111被定义成光棍节,这也算再无聊不过了。不过作为程序员…

报考阿里云acp认证,你得到的是什么?

放眼全球能够和亚马逊AWS、微软Azure竞争的,国内也就只有阿里云了。 阿里云目前稳居国内云计算市场第一,比排后面5名同行市场占有率的总和还要多,全球云计算市场,阿里云目前排名第3位。 阿里云的市场占有率说明市场对于阿里云产…

kafka、zookeeper、flink测试环境、docker

1、kafka环境单点 根据官网版本说明(3.6.0)发布,zookeeper依旧在使用状态,预期在4.0.0大版本的时候彻底抛弃zookeeper使用KRaft(Apache Kafka)官方并给出了zk迁移KR的文档 2、使用docker启动单点kafka 1、首先将kafka启动命令,存储为.servi…

小程序:uniapp解决主包体积过大的问题

已经分包但还是体积过大 运行时勾选“运行时是否压缩代码”进行压缩 在manifest.json配置(开启分包优化) "mp-weixin" : {"optimization" : {"subPackages" : true}//.... },在app.json配置(设置组件按需注入…

ubuntu 22.04修改永久修改 mac 地址

使用 rc-local.service rc-local.service 是系统自带的一个开机自启服务&#xff0c;但是在 ubuntu 20.04 上&#xff0c;该服务默认没有开启。 在文件的最后面添加 [Install] 段的内容&#xff0c; cat >> /lib/systemd/system/rc-local.service << EOF # SPD…

TCP通信-同时接受多个客户端消息

同时处理多个客户端消息的原理 代码实现 public class ClientDemo1 {public static void main(String[] args) {try {System.out.println("客户端启动");// 1、创建Socket通信管道请求有服务端的连接// public Socket(String host, int port)// 参数一&#xff1a;服…

现代 ERP 系统,如何使中小企业智能制造商受益?

中小企业智能制造商大多依靠手工操作或电子表格模式&#xff0c;或少数几个软件组成的集合体&#xff0c;或是依靠传统的ERP系统来管理企业运营。经营利润率低、订单到现金的周期缓慢、客户付款延迟、管理成本增加&#xff0c;使他们的生存变得更加困难。许多企业一直在以最少的…

视频模板SDK,为企业带来无限创意与效率

在当今的数字化时代&#xff0c;视频已经成为了信息传播的主流方式之一&#xff0c;对于企业来说&#xff0c;制作高质量的视频已经成为了一项重要的业务需求。然而&#xff0c;制作一部高质量的企业视频需要耗费大量时间和金钱&#xff0c;对于许多企业来说是一个不小的负担。…

Flask项目数据库配置、redis配置、session配置、csrf配置

1. 在app.py文件中 from datetime import timedelta from flask_wtf.csrf import CSRFProtect from flask import Flask, session from flask_sqlalchemy import SQLAlchemy from redis import StrictRedis from flask_session import Sessionapp Flask(__name__)class Confi…

软件测试基础知识整理(详细版)

一、软件测试概述 1、软件缺陷 软件缺陷&#xff1a;又称之为“Bug”。即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误&#xff0c;或者隐藏的功能缺陷。 缺陷的表现形式&#xff1a; 软件没有实现产品规格说明书所要求的功能模块&#xff1b; 软件中出现了产…

数据结构 优先级队列(堆)

数据结构 优先级队列(堆) 文章目录 数据结构 优先级队列(堆)1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现…

再见Jenkins!你好,GitLink引擎,更强大的自动化部署工具!

文章目录 写在前面一、准备工作1.1 注册GitLink账号1.2 托管项目1.3 新建项目管理引擎流水线 二、开始构建流水线2.1 进入图形流水线编辑页2.2 添加git clone节点2.3 添加shell节点2.4 添加allure html节点2.5 添加新建GitLink疑修节点2.6 添加钉钉通知节点2.7 设置任务触发器2…

碰到一个用pip死活装不上模块的问题(ModuleNotFoundError: No module named ‘triton‘)

折腾了半天才发现问题的根源在于平台不同。 当我在windows上尝试用pip install triton命令安装该模块的时候&#xff0c;总会提示 A matching Triton is not available, some optimizations will not be enabled. Error caught was: No module named triton而一个模块如果只在…

Python学习基础笔记七十五——Python调用其他程序

Python经常被用来开发自动化程序。自动化程序往往需要调用其他的程序。 例如&#xff0c;我们可以代码中调用wget程序&#xff0c;而不是自己开发下载的代码。 这就是我们经常做的&#xff0c;在我们的Python程序中调佣其它程序&#xff0c;帮我们实现功能。 Python中调用外部…

危险化工品出口注意事项及法规要求_箱讯科技

随着全球化工品市场的不断发展&#xff0c;危险化工品出口业务逐渐成为国际贸易的重要组成部分。然而&#xff0c;由于危险化工品具有潜在的危险性&#xff0c;出口过程中需严格遵守相关法规和注意事项&#xff0c;以确保运输安全和顺畅。本文将详细介绍危险化工品出口注意事项…

Linux | vim的入门手册

目录 前言 一、什么是vim 二、vim编辑器的模式 1、插入模式 &#xff08;1&#xff09;用vim打开文件 &#xff08;2&#xff09;进入插入模式 2、默认模式 &#xff08;1&#xff09;光标移动 &#xff08;2&#xff09;复制、粘贴与剪切操作 &#xff08;3&#x…

UE4中无法保存项目问题

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 取消&#xff1a;停止保存所有资产并返回编辑器。 重试&#xff1a;尝试再次保存资产。 继续&#xff1a;仅跳过保存该资产。 当我点击继续时&#xff0c;关闭项目&#xff0c;然后重新打开项目&#xff0c;发现之前…

广州虚拟动力携数字人全栈式产品,邀您来2023世界VR产业大会(南昌)一探虚实

2023年10月19-20日&#xff0c;由工业和信息化部、江西省人民政府联合主办&#xff0c;中国电子信息产业发展研究院、江西省工业和信息化厅、南昌市人民政府、虚拟现实产业联盟共同承办的2023世界VR产业大会将在南昌绿地国际博览中心盛大举办。 广州虚拟动力作为3D、AI虚拟人领…

guzzle http/guzzle如何在鉴权中使用,如何使用异步操作?

Guzzle HTTP客户端库提供了多种方式来进行鉴权&#xff0c;并且支持异步操作。以下是如何在Guzzle中执行鉴权和使用异步操作的示例&#xff1a; 1. 基本鉴权 Guzzle支持基本的HTTP基本认证&#xff08;Basic Authentication&#xff09;鉴权。您可以使用auth选项来指定用户名…

Syntax Error: Error: PostCSS received undefined instead of CSS string (已解决)

错误版本 "node-sass": "^5.0.0" "sass-loader": "^10.1.0" 解决办法如下&#xff1a; 这是因为node-sass 和 sass-loader版本不适配导致&#xff0c;请安装如下版本&#xff0c;并且运行如下命令&#xff1a; "node-sass":…