【stm32】TIM定时器输出比较-PWM驱动LED呼吸灯/舵机/直流电机

news2024/10/2 12:26:49

TIM定时器输出比较

  • 一、输出比较简介
    • 1、OC(Output Compare)输出比较
    • 2、PWM简介
    • 3、输出比较通道(高级)
    • 4、输出比较通道(通用)
    • 5、输出比较模式
    • 6、PWM基本结构
      • 配置步骤:
      • 程序代码:PWM驱动LED呼吸灯
    • 7、参数计算
    • 8、舵机简介
      • 程序代码:PWM驱动舵机
    • 9、直流电机及驱动简介
      • 程序代码:PWM驱动直流电机
    • 附加:引脚重映射

一、输出比较简介

1、OC(Output Compare)输出比较

  • 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
  • 每个高级定时器和通用定时器都拥有4个输出比较通道
  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能

2、PWM简介

  • PWM(Pulse Width Modulation)脉冲宽度调制
  • 在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
  • PWM参数:
    频率 = 1 / T(S)
    占空比 = T(ON) / T(S)
    分辨率 = 占空比变化步距
    在这里插入图片描述
    占空比决定了PWM等效出来的模拟电压的大小,占空比越大,等效的模拟电压就越趋近于高电平

如:此时高电平是5V,低电平是0V,50%占空比就等效于中间电压2.5V,20%占空比就等效于1/5处的电压1V

3、输出比较通道(高级)

在这里插入图片描述

4、输出比较通道(通用)

CCR(Capture Compare Register):捕获比较寄存器
在这里插入图片描述
\quad 左边是CNT计数器和CCR1第一路的捕获/比较寄存器,这两者之间进行比较,当CNT>CCR1,或者CNT=CCR1时,就会给输出模式控制器传一个信号,然后输出模式控制器就会改变它输出OC1REF的高低电平, REF信号实际上就是指图上oc1ref信号的高低电平,ETRF输入,是定时器的一个小功能(不需了解),此时高低电平输出到极性选择上(主模式控制器较少使用),给CC1P寄存器写0,信号走上面那路,就是信号电平不翻转,写1的话,信号走下面那路,信号通过一个非门取反,输出的信号就是输入信号高低电平反转的信号,这就是极性选择,即选择是否要把高低电平反转,接着走到输出使能电路,选择要不要输出,最后就是OC1引脚,这个引脚就是CH1通道的引脚。

5、输出比较模式

在这里插入图片描述

解释上图:
冻结即PWM暂停输出,有效电平即高电平,无效电平即低电平
PWM模式2和PWM模式1的区别在于比较值相同时,REF的高低电平相反,由此可以看出PWM模式2实际上就是PWM模式1输出的取反,改变PWM模式1和PWM模式2,就是改变REF电平的极性

6、PWM基本结构

在这里插入图片描述

蓝线为CNT值,黄线ARR值,红线为CCR值
占空比受CCR值调控, CCR值越大,占空比越大,反之输出的占空比越小
上图的REF是一个频率可调,占空比也可调的PWM波形

配置好时基单元后CNT自增运行,CCR由程序员自行设定,当CNT在自增运行时,CNT与CCR不断进行比较

配置步骤:

1、RCC开启时钟,打开TIM外设和GPIO外设的时钟;
2、配置时基单元,包括时钟源选择;
3、配置输出比较单元,包括CCR的值、输出比较模式、极性选择、输出使能等参数;
4、配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置;
5、运行控制,启动计数器,输出PWIM。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置PWM的GPIO口时需使用复用推挽输出,原因是:
\quad 对于普通的开漏/推挽输出,引脚的控制权是来自于输出数据寄存器(如下图1),如果想让定时器来控制引脚,就需要使用复用开漏/推挽输出的模式,在这里输出数据寄存器将被断开(如下图2),输出控制权将转移给片上外设,通过引脚定义表可知,这里片上外设引脚连接的是TIM2的CH1通道,所以只有把GPIO设置成复用推挽输出,引脚的控制权才能交给片上外设,PWM波形才能通过引脚输出。
图1:
图1
图2:在这里插入图片描述

要得到一个1KHZ,占空比50%,分辨率为1%的波形,计算如下:
在这里插入图片描述

程序代码:PWM驱动LED呼吸灯

// pwm.c
#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    

    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        //GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;        // ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;    //PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCStructInit(&TIM_OCInitStructure); // 给TIM_OCInitStructure结构体赋初始值,不使用的参数就可不配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  // 设置输出比较的模式    
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 设置输出比较的极性
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  // 设置输出使能
    TIM_OCInitStructure.TIM_Pulse = 0;        // 设置CCR初始值(若使用TIM_SetCompare1函数设置了CCR寄存器的值时,此参数可不设置)
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    
    TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2, Compare);
}

// main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void)
{
    OLED_Init();
    PWM_Init();
    
    while (1)
    {
        for (i = 0; i <= 100; i++)
        {
            PWM_SetCompare1(i); // 这里设置的是CCR寄存器的值,占空比是由CCR和ARR共同决定的
            Delay_ms(10);
        }
        for (i = 0; i <= 100; i++)
        {
            PWM_SetCompare1(100 - i);
            Delay_ms(10);
        }
    }
}

7、参数计算

在这里插入图片描述

  • PWM频率(计数器更新频率公式): Freq = CK_PSC / (PSC + 1) / (ARR + 1)
    上图可以看出,PWM的一个周期对应着计数器的一个溢出更新周期,所以PWM的频率就等于计数器的更新频率
  • PWM占空比: Duty = CCR / (ARR + 1)
    30/(99+1) = 30%
  • PWM分辨率: Reso = 1 / (ARR + 1)
    • CCR 的值范围是在0到ARR的值范围内,所以CCR的变化范围取决于ARR的值,ARR越大,CCR的范围就越大,对应的分辨率就越大。
    • 上面公式定义的分辨率是占空比最小的变化步距,使用的是ARR的值,ARR值越大,分辨率越小,占空比变化越细腻。

8、舵机简介

  • 舵机是一种根据输入PWM信号占空比来控制输出角度的装置
  • 输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms

周期为20ms,频率:1/20ms = 50HZ
在这里插入图片描述
硬件电路:
在这里插入图片描述
在这里插入图片描述
同一个定时器不同通道输出PWM的特点:
\quad 若想要同一定时器的多通道输出PWM,使用对应通道的函数即可,需要注意的是,对于同一个定时器的不同通道输出的PWM,因为不同通道共用一个计数器,所以这几个通道的频率必须是一样的;这几个通道的占空比由各自的CCR决定,可自行设定;还由于计数器更新,所有PWM同时跳变,所以这几个通道的相位是同步的

在这里插入图片描述

程序代码:PWM驱动舵机

// PWM驱动舵机
// pwm.c
#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  // PA1对应TIM2通道2
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1;        //ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;        //PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;        //CCR
    TIM_OC2Init(TIM2, &TIM_OCInitStructure);  // 初始化通道2
    
    TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare2(uint16_t Compare)
{
    TIM_SetCompare2(TIM2, Compare);
}
// Servo.c  舵机模块
#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Servo_Init(void)
{
    PWM_Init();
}

void Servo_SetAngle(float Angle)
{
    PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
// main.c
// 按下按键,舵机每次加30°,超180°后重新置0°
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Key.h"

uint8_t KeyNum;
float Angle;

int main(void)
{
    OLED_Init();
    Servo_Init();
    Key_Init();
    
    OLED_ShowString(1, 1, "Angle:");
    
    while (1)
    {
        KeyNum = Key_GetNum();
        if (KeyNum == 1)
        {
            Angle += 30;
            if (Angle > 180)
            {
                Angle = 0;
            }
        }
        Servo_SetAngle(Angle);
        OLED_ShowNum(1, 7, Angle, 3);
    }
}

9、直流电机及驱动简介

  • 直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
  • 直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作
  • TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向
    在这里插入图片描述
    硬件电路:

在这里插入图片描述
在这里插入图片描述

程序代码:PWM驱动直流电机

// PWM驱动直流电机
// motor.c
#include "stm32f10x.h"                  // Device header
#include "PWM.h"

void Motor_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    PWM_Init();
}

void Motor_SetSpeed(int8_t Speed)
{
    if (Speed >= 0)  // 正转
    {
        GPIO_SetBits(GPIOA, GPIO_Pin_4);
        GPIO_ResetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare3(Speed);
    }
    else   // 反转
    {
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
        GPIO_SetBits(GPIOA, GPIO_Pin_5);
        PWM_SetCompare3(-Speed);
    }
}
// pwm.c
#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;        //ARR
    TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;        //PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;        //CCR
    TIM_OC3Init(TIM2, &TIM_OCInitStructure);
    
    TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare3(uint16_t Compare)
{
    TIM_SetCompare3(TIM2, Compare);
}
// main.c
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"

uint8_t KeyNum;
int8_t Speed;

int main(void)
{
    OLED_Init();
    Motor_Init();
    Key_Init();
    
    OLED_ShowString(1, 1, "Speed:");
    
    while (1)
    {
        KeyNum = Key_GetNum();
        if (KeyNum == 1)
        {
            Speed += 20;
            if (Speed > 100)
            {
                Speed = -100;
            }
        }
        Motor_SetSpeed(Speed);
        OLED_ShowSignedNum(1, 7, Speed, 3);
    }
}

附加:引脚重映射

在这里插入图片描述
把TIM2的CH1从PA0重映射到PA15引脚,使用AFIO

使用的函数:
在这里插入图片描述
查数据手册:重映射方式和引脚对应关系,把PA0改到PA15,可以选择部分重映射方式1或者完全重映射
在这里插入图片描述

配置参数选择:
在这里插入图片描述
注意:使用引脚重映射时要注意引脚默认复用的是普通GPIO口还是调试端口,若是调试端口需先关闭调试端口的复用
\quad PA15上电后默认复用为调试端口JTDI,如果要让PA15作为普通的GPIO或者复用定时器的通道,需要先关闭调试端口的复用,使用GPIO_PinRemapConfig函数进行关闭,参照下表
在这里插入图片描述

1、把PA15,PB3,PB4当作普通IO使用需配置的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 开启AFIO RCC时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 解除JTAG的使用(PA15,PB3,PB4),,保留SWD的使用

2、重映射定时器或者其他外设的复用引脚需配置的(重映射引脚默认复用端口不是调试端口的情况)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 开启AFIO RCC时钟
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); // 配置重映射引脚(对照数据手册),选择部分重映射1

3、重映射定时器或者其他外设的复用引脚需配置的(重映射引脚是调试端口的情况)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 开启AFIO RCC时钟
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); // 配置重映射引脚(对照数据手册),选择部分重映射1
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 解除JTAG的使用(PA15,PB3,PB4),,保留SWD的使用

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

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

相关文章

nginx 安装(Centos)

nginx 安装-适用于 Centos 7.x [rootiZhp35weqb4z7gvuh357fbZ ~]# lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.9.2009 (Core) Release: 7.9.2009 Codename: Core# 创建文件…

大模型训练:K8s 环境中数千节点存储最佳实践

今天这篇博客来自全栈工程师朱唯唯&#xff0c;她在前不久举办的 KubeCon 中国大会上进行了该主题分享。 Kubernetes 已经成为事实的应用编排标准&#xff0c;越来越多的应用在不断的向云原生靠拢。与此同时&#xff0c;人工智能技术的迅速发展&#xff0c;尤其是大型语言模型&…

智慧政务助力实现服务民生新突破

在数字化转型的浪潮中&#xff0c;中国移动紧密结合人工智能&#xff08;AI&#xff09;技术&#xff0c;推动政务服务的智能化升级。近日&#xff0c;中国移动正式发布政务大模型3.0版本&#xff0c;以科技创新提升政务效率&#xff0c;实现服务民生的新突破。 为什么…

【Android】页面启动耗时统计流程梳理

文章基于Android 11 写在前面&#xff1a; 最近的文章都会放流程图&#xff0c;时序图之类的图片&#xff0c;解释下为什么这么做&#xff1a; 图片的好处&#xff1a; 流程清晰&#xff0c;一目了然很多代码&#xff0c;如同老太太的裹脚布&#xff0c;又臭又长。影响理解&a…

Python的Pandas库学习指南

应用场景 Pandas库因其强大的数据处理和分析能力&#xff0c;在数据科学和数据分析领域有着广泛的应用。 1. 数据清洗 处理缺失数据&#xff1a;通过删除或填充缺失值来清洗数据。数据类型转换&#xff1a;将数据转换为合适的格式&#xff0c;例如将日期字符串转换为日期类型…

k8s_资源管理介绍

资源管理介绍 在k8s中&#xff0c;所有内容都抽象成资源&#xff0c;用户需要通过操作资源来管理k8s k8s本身就是一个集群系统&#xff0c;用户可以在集群中部署服务&#xff0c;在k8s集群中运行一个个的容器&#xff0c;将指定的程序部署到容器中 k8s最小的管理单元是pod&…

AI-Talk开发板之wifi scan

一、说明 AI-Talk开发板使用ESP32-C3扩展WIFI通信功能&#xff0c;与CSK6011A通过SPI接口通信。 与处理器的信号连接&#xff1a; ESP32-C3需要烧录hosted固件&#xff0c;参考&#xff1a;AI-Talk开发板更新ESP32固件_esp32 固件-CSDN博客 二、工程 1、创建项目 进入exampl…

本地编译安装|编译安装最新版postgis3.4.3版本指南

一、本地编译安装步骤介绍 本地编译&#xff0c;指的是在本地环境编译安装某个软件&#xff0c;例如&#xff0c;本文所述的最新版postgis3.4.3&#xff0c;本地是什么cpu架构&#xff0c;编译完成后&#xff0c;编译产出物就可以在其它的同cpu架构的服务器上直接适用了&#…

关于JAVA中Scanner和sout读取超时问题

1.Scanner与System.out为什么慢 Scanner读取速度慢的原因&#xff1a; 在ACM模式下&#xff0c;输入数据和输出数据时&#xff0c;他会将数据放在一个文件里面 在new上一个Scanner时&#xff0c;去调用一个next&#xff08;&#xff09;方法&#xff0c;他会去访问IO设备&…

【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh

介绍 iTerm2 iTerm2是默认终端的替代品&#xff0c;也是目前Mac系统下最好用的终端工具&#xff0c;集颜值和效率于一身。 Oh-My-Zsh Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。 它基于Zsh 命令行&#xff0c…

docker-文件复制(docker ps:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…

怎么批量制作文本或链接静态码?批量静态码在线的生成技巧

怎么将文本或者链接做成静态二维码呢&#xff1f;有很多的场景都会使用静态二维码&#xff0c;在需要制作大量静态二维码时&#xff0c;有什么方法能够快速提高二维码制作效率呢&#xff1f;在网上能够找到在线二维码生成器的功能来快速生成二维码&#xff0c;下面通过这篇文章…

【shell脚本8】Shell脚本学习--其他

目录 ​编辑 Shell输入输出重定向 重定向深入讲解 Here Document Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入&#xff0c;将结果输出到标准输出设备(stdout)显示。一般情况下&#xff0c;标准输入设备就是键盘&#xff0c;标准输出设备就是终端&…

JAVA-StringBuilder和StringBuffer

一、认识String类 1.认识 String在Java中是字符串类型&#xff0c;但与其他类型不同。它是一个类&#xff0c;可以创建对象的类。与int、char等自待类型有些许不同。但它仍然是java提供的一种类型。 类中有4个属性&#xff0c;这里主要认识一下value属性。它是实际存放字符串…

AI 赋能大模型:从 ChatGPT 到国产大模型的角逐与发展契机

在当今科技飞速发展的时代&#xff0c;大模型作为人工智能领域的关键技术&#xff0c;正引发着深刻的变革。它们在自然语言处理、计算机视觉、语音识别等众多领域展现出了惊人的潜力&#xff0c;为各行各业带来了前所未有的机遇和挑战。本文将深入剖析大模型的技术原理、市场态…

字符串的join和os.path.join()

>>> key "".join("I love China.")>>> keyI love China.>>> key.join("--xwf")-I love China.-I love China.xI love China.wI love China.f为什么执行key.join("--xwf")的结果不是“I love China.--xwf”…

鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目案例分析

摘 要&#xff1a;分布式光伏发电利用太阳能光伏板&#xff0c;分散布置在各区域&#xff0c;通过小规模、模块化并网或独立使用。其特点为就近发电、并网、转换和使用。技术进步和政策支持降低了光伏组件成本&#xff0c;推动了分布式光伏监控系统在多个领域的广泛应用。在全球…

【学习笔记】UWB技术定位原理

UWB技术还没有完全普及&#xff0c;却在慢慢兴起&#xff0c;一旦爆发&#xff0c;势不可挡也。 01-什么是UWB&#xff1f; UWB&#xff08;Ultra Wide Band&#xff09;是一种无载波通信技术&#xff0c;UWB不使用载波&#xff0c;而是使用短的能量脉冲序列&#xff0c;并通…

TikTok多语言商城系统源码+落地页 附搭建教程

TikTok多语言商城系统源码落地页 附搭建教程 环境 nginx php7.4.33 redis5.0.8 Memcached 1.6.6 mysql5.6 phpMyAdmin 伪静态 location / { try_files $uri $uri/ /index.php?$query_string; } 源码下载&#xff1a;https://download.csdn.net/download/m0_660477…

CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队)

关联比赛: CVPR2021 安全AI挑战者计划第六期&#xff1a;防御模型的白盒对抗攻击 CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 &#xff08;UM-SIAT队&#xff09; 1.赛题简介 1.比赛通过15个防御模型测试攻击算法&#xff0c;其中包括13个在CIFAR-10上训练的模型…