Firefly开源社区

【Golang】根据cpu温度控制风扇转速GO!GO!GO!!

886

积分

1

威望

3

贡献

技术大神

Rank: 3Rank: 3

积分
886
QQ
发表于 2015-5-27 11:38:01     
本帖最后由 madman 于 2015-5-28 09:13 编辑

之前看到论坛上tjCFenggo语言教程,写得很有意思,然后就想试试。就照着wiki上的教程搭建好了编译环境。下载了tjCFenggork3288库,然后发现温度和pwm都有,于是我就想到将之前的根据cpu温度控制风扇移植过来。因为【GoRK3288】里的函数都封装好了,还有教程。所以试了下就出来了,不过里面的pwm默认设置是高电平的。发现go语言还是很方便的,而且跟c挺像的,会点c基本上就可以直接开始用来写点简单的东西了。功能跟之前的驱动那个是一样的(ps:不过省事多了~~),下面附上代码
package main
import (
        "fmt"
        "time"
        "github.com/tjCFeng/GoRK3288/RK3288"

)
func main() {
        defer RK3288.FreeRK3288()
        PWM1, _ := RK3288.CreatePWM(RK3288.PWM_1)
        PWM1.SetInactivePolarity(RK3288.Positive)
        PWM1.SetPERIOD(50000)
        PWM1.SetDUTY(0)
        PWM1.SetCNT(0)
        PWM1.Start()

        for{
                time.Sleep(time.Second * 1)
                _, Data, _, _ := RK3288.ITSADC().GetData()
                var adc_date = RK3288.ITSADC().GetTemperature(Data)
                fmt.Println("Temperature:",adc_date)
                fmt.Println("Period:",50000)
                if adc_date <= 40{
                        PWM1.Stop()
                        PWM1.SetPERIOD(50000)
                        PWM1.SetDUTY(50000)
                        PWM1.SetCNT(0)
                        PWM1.Start()
                        fmt.Println("Duty:",50000)
                }else if adc_date >= 40 || adc_date <= 60{
                        PWM1.Stop()
                        PWM1.SetPERIOD(50000)
                        PWM1.SetDUTY(50000-(uint32)(adc_date) * 766)
                        PWM1.SetCNT(0)
                        PWM1.Start()
                        fmt.Println("Duty:",(50000-(uint32)(adc_date) * 766))
                }else if adc_date >= 60{
                        PWM1.Stop()
                        PWM1.SetPERIOD(50000)
                        PWM1.SetDUTY(0)
                        PWM1.SetCNT(0)
                        PWM1.Start()
                        fmt.Println("Duty:",0)
                }

        }

}

回复

使用道具 举报

发表于 2015-5-27 11:49:21     
支持原创:lol
暴走的创客!
回复

使用道具 举报

2580

积分

56

威望

46

贡献

社区版主

Rank: 7Rank: 7Rank: 7

积分
2580

优秀版主论坛元老

发表于 2015-5-27 13:39:42     
回复

使用道具 举报

647

积分

23

威望

20

贡献

技术大神

Rank: 3Rank: 3

积分
647

突出贡献

发表于 2015-5-28 07:17:36     
赞一个:lol

程序可以优化一下,
PWM1.SetPERIOD(50000)由于没有设置其他的值,所以可以放在if的前面,只要一句就可以了;
PWM1.Stop(),PWM1.SetCNT(0)也是这样;
PWM1.Start()可以在设置好所有的参数后统一执行,也就是放在if之后,同样一句就可以。

也就是说 if 里只设置 PWM1.SetDUTY, 其他条件相同的语句不需要重复,这样程序的代码看起来更少:lol
回复

使用道具 举报

647

积分

23

威望

20

贡献

技术大神

Rank: 3Rank: 3

积分
647

突出贡献

发表于 2015-5-28 07:31:11     
由于PWM控制的参数比较多,我偷懒了没有封装的太全,抱歉抱歉。:lol
如果想控制高低电平的话,可以对寄存器直接赋值,方法是:
在创建了PWM1的实例后,*PWM1.PWM_CTRL|= (0x1 << X)置1;*PWM1.PWM_CTRL &^= (0x1 << X)清零,和普通的寄存器控制是一样的,
这样就可以对没有封装到的地方进行控制了。
回复

使用道具 举报

886

积分

1

威望

3

贡献

技术大神

Rank: 3Rank: 3

积分
886
QQ
发表于 2015-5-28 09:08:01     
tjCFeng 发表于 2015-5-28 07:31
由于PWM控制的参数比较多,我偷懒了没有封装的太全,抱歉抱歉。
如果想控制高低电平的话,可以对寄存 ...

好的,非常感谢:lol!!!我继续修改一下。{:3_52:}
回复

使用道具 举报

886

积分

1

威望

3

贡献

技术大神

Rank: 3Rank: 3

积分
886
QQ
发表于 2015-5-28 15:03:42     
package main
import (
        "fmt"
        "time"
        "github.com/tjCFeng/GoRK3288/RK3288"

)
func main() {
        defer RK3288.FreeRK3288()
        PWM1, _ := RK3288.CreatePWM(RK3288.PWM_1)
        PWM1.SetInactivePolarity(RK3288.Negative)
        PWM1.SetPERIOD(50000)
        for{
                time.Sleep(time.Second * 1)
                _, Data, _, _ := RK3288.ITSADC().GetData()
                var adc_date = RK3288.ITSADC().GetTemperature(Data)
                fmt.Println("Temperature:",adc_date)
                fmt.Println("Period:",50000)
                PWM1.Stop()
                if adc_date <= 40{
                        PWM1.SetDUTY(50000)
                        fmt.Println("Duty:",50000)
                }else if adc_date >= 40 || adc_date <= 60{
                        PWM1.SetDUTY(50000-(uint32)(adc_date) * 766)        
                        fmt.Println("Duty:",(50000-(uint32)(adc_date) * 766))
                }else if adc_date >= 60{
                        PWM1.SetDUTY(0)
                        fmt.Println("Duty:",0)
                }
                PWM1.SetCNT(0)
                PWM1.Start()
        }
}

只是修改了下句式,PWM1.SetInactivePolarity(RK3288.Positive),这个改了之后是将pwm是释放之后端口高低电平的控制,不会影响到duty的控制的的占空比高低,不过手册里本身duty就是控制低电平的
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表